【问题标题】:hibernate envers: merge & saveOrUpdate休眠环境:合并和保存或更新
【发布时间】:2011-07-15 18:40:41
【问题描述】:

我正在开发一个 spring-hibernate-envers 应用程序。经过大量谷歌搜索后,事情终于对我有用,但我仍然有几个问题。

  1. 之前我使用saveOrUpdate 保存或更新实体。但 与 envers 合作时 扔一个nonUniqueObject 例外。所以我改用merge 它奏效了。使用是否正确 为此合并? merge 是否插入 数据库的新对象?

  2. 我尝试了以下代码:

entity=merge(entity);  
saveOrUpdate(entity);

这也有效。这是正确的方法吗?而且我很好奇为什么saveOrUpdate 现在没有抛出任何错误。

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    Hibernate Reference 说:

    saveOrUpdate() 执行以下操作:

    • 如果对象已在此会话中持久存在,则不执行任何操作
    • 如果与会话关联的另一个对象具有相同的标识符,则抛出异常
    • 如果对象没有标识符属性,则保存()它
    • 如果对象的标识符具有分配给新实例化对象的值,则保存()它
    • 如果对象由 or 版本化,并且版本属性值与分配给新实例化对象的值相同,则保存()它
    • 否则更新()对象

    和merge()很不一样:

    • 如果存在与当前会话关联的具有相同标识符的持久实例,则将给定对象的状态复制到持久实例上
    • 如果当前没有与会话关联的持久化实例,请尝试从数据库中加载它,或者创建一个新的持久化实例
    • 持久化实例被返回
    • 给定实例未与会话关联,它保持分离状态

    这意味着如果您确定具有相同标识符的对象与会话没有关联,则可以使用saveOrUpdate()。否则你应该使用merge()

    以下代码

    entity=merge(entity);
    saveOrUpdate(entity); 
    

    之所以有效,是因为merge() 的结果是一个持久对象,因此它被saveOrUpdate() 忽略,因此第二行没有任何意义。

    【讨论】:

    • 好的,所以如果我不确定具有相同 id 的对象是否与会话相关联,我应该使用合并。正如您已经提到的那样,合并还会将新对象插入到数据库中,应该没有问题。合并是否需要比 saveOrUpdate 更多的资源?谢谢你的回答。
    • @parbi:与saveOrUpdate 相比,merge 生成了一个额外的 SQL 查询,因为saveUpdate 使用标识符来确定是否应该保存对象,而merge 会根据数据库检查它。
    • 你确定这个语句:merge() 的结果是一个持久对象,因此它被 saveOrUpdate() 忽略,所以第二行没有任何意义?如您的回答所述,合并后对象仍处于分离状态
    • @fabien7474:从merge() 返回的对象是持久的,而传递给它的对象保持分离。
    • @axtavt:您在之前的评论中对merge() 的观察非常出色,帮助我解决了我的问题+1:D
    【解决方案2】:

    saveOrUpdate: 如果请求的对象是瞬态的(空主键值),则将其保存在数据库中或更新它。条件是会话中该实体只有一个副本。

    merge: Hibernate 会首先检查该类型的 Persistent 实例是否已经存在于持久化中 语境。它使用对象标识符来检查这种存在。如果另一个实例存在,它会复制状态 将 Detached 对象转换为现有的 Persistence 对象。如果不存在其他实例, Hibernate 只是重新附加 Detached 对象。

    如果会话包含一个实体的多个副本,则使用最新实体更新所有副本。 在您调用 update 之前,它不会在数据库中更新。

    【讨论】:

    • 所以我每次合并后都需要使用 saveOrUpdate 吗?感谢您的回答。
    • 是的。因为给定的实例没有与会话关联,所以它保持分离状态。
    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 2011-09-20
    • 2015-05-13
    • 2013-06-09
    • 1970-01-01
    • 2014-06-10
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多