为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Data CrudRepository 仅在调用 save() 时返回更改的字段

Spring Data CrudRepository 仅在调用 save() 时返回更改的字段

翻翻过去那场雪 2021-11-24 15:05:36
我正在使用 Spring Data(版本 1.13.9.RELEASE)并且有一个CrudRepository叫做myRepository. 我正在调用myRepository.save(myObject), 以覆盖myObject数据库中的现有实例,并且我指定了myObjectas 的一些字段null。例如:{    "prop1": "val1",    "prop2": null,    "prop3": "val3"}当我调用myRepository.save(myObject)并读取返回值时,myObject我设置的所有字段null都返回为null(prop2在本例中如此)。但是,prop2数据库中的值不是null在调用之后save()- 在我调用之前它仍然具有先前的值save()。这实际上是我在这种特定情况下想要的行为(null调用时忽略值myRepository.save()),但我希望 的返回值save()反映操作后数据库中的实际内容,而不是仅返回更新的字段和设置指定为nulltonull或其默认值的字段(例如false在布尔值的情况下。这是CrudRepository'ssave()行为的预期行为吗?
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

要理解这个问题,您需要对 Hibernate Object Lifecycle 有所了解。

Hibernate 对象生命周期由以下状态组成:1. 瞬态状态 2. 持久状态 3. 分离状态等

当您创建一个新对象时,它处于瞬态,Hibernate 无法检测在瞬态中存在/创建的对象。

当您调用时save() saveOrUpdate(),对象从瞬态状态移动到持久状态,现在 Hibernate 将开始跟踪对对象所做的所有更改(但对象尚未写入数据库)。

因此,在您的情况下,由于对象未处于持久状态,因此 hibernate 无法识别它并将触发(最有可能)insert查询。但是,如果对象已经处于持久状态,hibernate 会知道某些字段已修改,因此将触发update查询。

这就是为什么如果您希望休眠来触发update查询,您需要确保对象处于持久状态。


查看完整回答
反对 回复 2021-11-24
?
烙印99

TA贡献1829条经验 获得超13个赞

这意味着事务尚未完成,所有更改仅在缓存中。要强制更新,您可以调用entityManager.flush()或移动您需要的所有逻辑到另一个服务或管理器的单独公共方法中,并将其注释为@Transactional


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 352 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信