我正在使用 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
查询,您需要确保对象处于持久状态。
烙印99
TA贡献1829条经验 获得超13个赞
这意味着事务尚未完成,所有更改仅在缓存中。要强制更新,您可以调用entityManager.flush()
或移动您需要的所有逻辑到另一个服务或管理器的单独公共方法中,并将其注释为@Transactional
添加回答
举报
0/150
提交
取消