我有时会注意到我的父/子对象或多对多关系,我需要调用SaveOrUpdate
或者Merge
.通常,当我需要调用时,我调用SaveOrUpdate
的异常Merge
与不首先保存的瞬态对象有关.
请解释两者之间的区别.
这是第10.7节.Hibernate参考文档的自动状态检测:
saveOrUpdate()执行以下操作:
如果对象在此会话中已经持久化,则不执行任何操作
如果与会话关联的另一个对象具有相同的标识符,则抛出异常
如果对象没有标识符属性,则保存()它
如果对象的标识符具有分配给新实例化对象的值,则保存()它
如果对象是版本化的(通过
或 ),并且version属性值是分配给新实例化对象的相同值,则save()它 否则更新()对象
和merge()是非常不同的:
如果存在具有当前与会话关联的相同标识符的持久实例,则将给定对象的状态复制到持久实例上
如果当前没有与会话关联的持久性实例,请尝试从数据库加载它,或者创建新的持久性实例
返回持久化实例
给定的实例不会与会话关联,它仍然是分离的
如果您尝试更新一个与会话分离的对象,则应使用Merge(),尤其是当可能存在当前与会话关联的那些对象的持久实例时.否则,在这种情况下使用SaveOrUpdate()会导致异常.
据我所知,merge()
将可能不与当前会话相关联的对象,并且(属性值等)复制状态到一个对象是与当前会话相关联的(具有相同的PK值/标识符,的课程).
saveOrUpdate()
将根据给定对象的标识值在会话上调用" 保存"或" 更新 ".