【问题标题】:What are the differences between Hibernate Session methods saveOrUpdate() and merge()?Hibernate Session 方法 saveOrUpdate() 和 merge() 有什么区别?
【发布时间】:2011-05-26 15:11:49
【问题描述】:

HibernateSession方法saveOrUpdate(Object)merge(Object)有什么区别?当给定对象在相应的表中不存在时,这两种方法似乎都会生成一个SQLINSERT 语句,而当它确实存在时会生成一个UPDATE

【问题讨论】:

  • 您是否真的阅读了您链接到的 java 文档? :)
  • 是的,我做到了。我看到的主要区别是merge() 加载了一个不在会话中的对象,而saveOrUpdate() 没有。这是否意味着部分对象的saveOrUpdate() 覆盖所有字段,而merge() 仅覆盖那些已设置为非空值的字段?还是两者都产生相同的结果?

标签: java hibernate


【解决方案1】:

虽然这适用于 NHibernate,但它也适用于 Hibernate:

NHibernate - Difference between session.Merge and session.SaveOrUpdate?

【讨论】:

  • 根据第三条评论,NHibernate Merge()SaveOrUpdate() 产生完全相同的结果。 (评论者说SaveOrUpdate() 只是委托给Merge()。)
  • 好吧,如果这是真的,那么 Hibernate 就不一样了 :-) 两个调用 可能 产生相同的结果,但取决于实体的状态。我不会复制文档,而是只提供更新的链接 :-) docs.jboss.org/hibernate/core/3.5/reference/en/html/…
【解决方案2】:

如果我没记错的话,merge 是针对当前不受管理的非关联实例。它将根据 id 进行查找并将两者合并。

【讨论】:

  • “合并两个”对象是什么意思?它如何知道要合并哪些字段?它是否仅合并那些没有差异的或那些不同且非空的?第一种情况与更新没有区别,而第二种情况与保存和更新都不同。
  • 查看引用规范的链接问题的第二个答案。 3.2.4.1 - stackoverflow.com/questions/3870844/… 看起来分离的实例会覆盖大部分数据,除非字段被标记为惰性或类支持版本。
【解决方案3】:

SaveOrUpdate versus Merge in Hibernate 解释了saveOrUpdate()merge() 之间的区别。

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 2011-05-29
    • 2020-07-16
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多