当前位置:  开发笔记 > 编程语言 > 正文

session.Merge和session.SaveOrUpdate有什么区别?

如何解决《session.Merge和session.SaveOrUpdate有什么区别?》经验,为你挑选了2个好方法。

我有时会注意到我的父/子对象或多对多关系,我需要调用SaveOrUpdate或者Merge.通常,当我需要调用时,我调用SaveOrUpdate的异常Merge与不首先保存的瞬态对象有关.

请解释两者之间的区别.



1> David Crow..:

这是第10.7节.Hibernate参考文档的自动状态检测:

saveOrUpdate()执行以下操作:

如果对象在此会话中已经持久化,则不执行任何操作

如果与会话关联的另一个对象具有相同的标识符,则抛出异常

如果对象没有标识符属性,则保存()它

如果对象的标识符具有分配给新实例化对象的值,则保存()它

如果对象是版本化的(通过),并且version属性值是分配给新实例化对象的相同值,则save()它

否则更新()对象

和merge()是非常不同的:

如果存在具有当前与会话关联的相同标识符的持久实例,则将给定对象的状态复制到持久实例上

如果当前没有与会话关联的持久性实例,请尝试从数据库加载它,或者创建新的持久性实例

返回持久化实例

给定的实例不会与会话关联,它仍然是分离的

如果您尝试更新一个与会话分离的对象,则应使用Merge(),尤其是当可能存在当前与会话关联的那些对象的持久实例时.否则,在这种情况下使用SaveOrUpdate()会导致异常.


你确定吗?查看NHiberante源SaveOrUpdateCopy会触发Merge事件,其参数与Merge函数相同.我认为它们是相同的,SaveOrUpdateCopy函数是hibernate/nhibernate中存在的东西,因为1.0 Merge函数是新的,并被添加到hibernate以符合新的java标准(我认为)
@Torkel - "SaveOrUpdateCopy"与"SaveOrUpdate"不同.我不确定提问者是否想要比较"合并"前者或后者.`SaveOrUpdateCopy`是一个现在过时的方法,它在导入`Merge`之前在NHibernate中进行了合并.

2> Ryan Duffiel..:

据我所知,merge()将可能不与当前会话相关联的对象,并且(属性值等)复制状态到一个对象与当前会话相关联的(具有相同的PK值/标识符,的课程).

saveOrUpdate()将根据给定对象的标识值在会话上调用" 保存"或" 更新 ".

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有