猿问

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

我正在使用 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()行为的预期行为吗?


翻翻过去那场雪
浏览 353回答 2
2回答

慕桂英4014372

要理解这个问题,您需要对 Hibernate Object Lifecycle 有所了解。Hibernate 对象生命周期由以下状态组成:1. 瞬态状态 2. 持久状态 3. 分离状态等当您创建一个新对象时,它处于瞬态,Hibernate 无法检测在瞬态中存在/创建的对象。当您调用时save() saveOrUpdate(),对象从瞬态状态移动到持久状态,现在 Hibernate 将开始跟踪对对象所做的所有更改(但对象尚未写入数据库)。因此,在您的情况下,由于对象未处于持久状态,因此 hibernate 无法识别它并将触发(最有可能)insert查询。但是,如果对象已经处于持久状态,hibernate 会知道某些字段已修改,因此将触发update查询。这就是为什么如果您希望休眠来触发update查询,您需要确保对象处于持久状态。

烙印99

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

相关分类

Java
我要回答