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

Evi*_*Syn 86 nhibernate session

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

请解释两者之间的区别.

Dav*_*row 156

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

saveOrUpdate()执行以下操作:

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

和merge()是非常不同的:

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

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

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

Rya*_*eld 9

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

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