为什么Hibernate中的save/saveOrUpdate方法被弃用了?

6
我在提问之前进行了很多研究,但始终找不到答案。我使用的是Hibernate 6.1版本,而互联网上的大多数文章/教程都使用旧版本的Hibernate,其中大多数方法已经被弃用。 尽管使用saveOrUpdate方法对我来说很有效,但如果它已经被弃用,一定有原因。即使是最新版本的官方Hibernate文档(如果我找到了正确的文档),也在使用它。 我读过这里的另一个问题,他们说你甚至不需要使用savesaveOrUpdate,因为Hibernate将自动刷新对对象内字段所做的任何更新。但是,即使在更新对象中的值并手动刷新/刷新或提交事务后,这也没有发生。
感谢您的帮助!
1个回答

7
浏览Hibernate的源代码,可以发现这个提交记录标记了这些方法已被弃用。该提交记录是此拉取请求的一部分,提到了相应问题。停用这些操作的原因如下:

update() 和 saveOrUpdate() 操作本质上是Hibernate早期的一个失败实验,并被JPA规范中的merge()所取代。我认为很明显,用户使用merge()遇到的问题比使用update()少得多,我们应该早就将这些操作标记为已弃用。

save() 操作与 saveOrUpdate() 几乎相同,唯一的区别在于它返回一个id。你可以像使用persist()一样使用它,但我认为persist()更好。

如果想更深入了解此话题,请查看相关问题进行讨论。

我在这里读到另一个问题,他们说你甚至不需要使用save或saveOrUpdate,因为Hibernate会自动刷新对对象内部字段所做的任何更新。

我从未听说过这种行为。您应该使用persist()作为save()的替代方案。

2
persist() 用于插入新数据。 根据日志,Hibernate 似乎在现有行上运行 INSERT 语句。 导致 SQLConstraintViolationException 出现重复条目。那么 merge() 呢? - Nestirium
3
是的,你说得对。我忘了提到merge()作为saveOrUpdate()的替代方法。 - Garuno
但是..如果实体不在会话中,merge()可能会发出SELECT查询。 - Stanislav Bashkyrtsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接