一尘不染

会话中保存,更新,saveOrUpdate,合并方法之间的区别?

hibernate

我是Hibernate的新手,上周完成了Hibernate教程。我对Session类中的方法save,update,saveOrUpdate和merge有一些疑问。这些是:

  • 保存方法: 用于将新创建的对象插入数据存储区。(为此,基本标识符值将为0)。就像我创建一个新客户并调用保存操作一样,它将把它持久保存在数据存储区中并生成标识符。

它是否正确?如果我们在已经存在的对象上调用保存,则不确定会发生什么?

  • 更新方法: 用于更新数据存储区中已经持久的对象。(基本上,标识符值将为此一些非零值)。就像我加载新客户并在某些字段值更新后调用更新操作一样,它将在数据存储区中对其进行更新。

根据我的理解,它应该会因某些异常而失败,因为根据API更新是针对分离对象的。它是否正确?如果是的话,我们应该在同一会话中调用什么来更新对象(我的意思是如果对象未分离)。另一点是:如果我们调用新创建的对象的更新,将会发生什么?

  • saveOrUpdate方法: 它将基于未保存的值检查(上述操作必须基于标识符零或非零值进行,是吗?),因此将调用上述方法之一,因此,如果我们拥有持久的客户对象,并且更新其客户的姓氏并创建新帐户,然后saveOrUpdate会处理。

我理解正确吗?

  • 合并方法: 它的作用类似于更新,但是在这里,如果会话中已经存在具有相同标识符的持久对象,它将更新持久对象中的分离对象值并将其保存。

但是,如果当前没有与该会话相关联的持久实例,则这将从数据存储中加载持久对象,然后在已加载的持久对象中更新分离对象的值,然后对其进行更新。

我也明白了吗?


阅读 277

收藏
2020-06-20

共1个答案

一尘不染

您在所有评估中都完全正确。你懂了。

对于您的第一个问题,如果我没记错的话,请save专门进行插入。因此,再次调用save将导致数据库中的另一行。

对于第二个问题,请update更新会话中的对象。因此,如果对象在会话中,它将进行更新。如果对象不在会话中,则应调用merge。我相信,调用update分离的实例将导致异常。

2020-06-20