Hibernate中不同的保存方法之间有什么区别?
时间:2020-03-06 15:00:50 来源:igfitidea点击:
Hibernate有几种方法,它们以一种或者另一种方式将对象放入数据库。它们之间有什么区别,何时使用它们?为什么不只有一种智能的方法知道何时使用什么?
到目前为止,我已经确定的方法是:
save()
update()
saveOrUpdate()
saveOrUpdateCopy()
merge()
persist()
解决方案
这是我对方法的理解。尽管我在实践中不使用所有这些功能,但主要是基于API的功能。
saveOrUpdate
根据某些检查,调用保存或者更新。例如。如果不存在标识符,则调用save。否则,将调用更新。
救
坚持一个实体。如果不存在,将分配一个标识符。如果有的话,它实际上是在进行更新。返回生成的实体ID。
更新
尝试使用现有标识符来持久化实体。如果不存在标识符,则认为会引发异常。
saveOrUpdateCopy
不推荐使用此方法,不应再使用它。相反,有...
合并
现在,这是我的知识开始动摇的地方。这里重要的是临时实体,分离实体和持久实体之间的区别。有关对象状态的更多信息,请在此处查看。使用保存和更新,我们可以处理持久对象。它们链接到会话,因此Hibernate知道发生了什么变化。但是,当我们有一个临时对象时,就不会涉及任何会话。在这些情况下,我们需要使用merge进行更新,并坚持保存。
坚持
如上所述,它用于瞬态对象。它不返回生成的ID。
- 请参见Hibernate论坛,以了解持久和保存之间的细微差别。看起来不同之处在于最终执行INSERT语句的时间。由于save确实返回了标识符,因此无论事务状态如何,INSERT语句都必须立即执行(这通常是一件坏事)。 Persist不会仅在分配标识符的情况下在当前正在运行的事务之外执行任何语句。保存/持久化都可用于瞬态实例,即尚未分配标识符且因此未保存在数据库中的实例。
- 更新和合并都适用于分离的实例,即在数据库中具有相应条目但当前未添加到会话(或者由会话管理)的实例。它们之间的区别是传递给函数的实例发生了什么。 update尝试重新添加该实例,这意味着该会话现在可能没有持久实体的其他实例添加到Session上,否则将引发异常。合并,但是,仅将所有值复制到会话中的持久实例(如果当前未加载,则将加载该实例)。输入对象未更改。因此,合并比更新更笼统,但可能会使用更多资源。
请注意,如果我们对一个分离的对象调用更新,则无论我们是否更改了该对象,数据库中总会有一个更新。如果不是我们想要的,则应将Session.lock()与LockMode.None一起使用。
仅当在当前会话范围之外更改对象时(处于分离模式时),才应调用update。