使用会话中的另一个对象休眠saveOrUpdate
时间:2020-03-05 18:42:54 来源:igfitidea点击:
如果已经有一个使用该标识符加载到会话中的对象,是否可以使用Hibernate保存对象?
- 如果会话包含那个确切的对象,而不是另一个具有相同ID的对象,则执行session.contains(obj)似乎只会返回true。
- 如果对象是新对象,则使用
merge(obj)
会引发异常。
解决方案
回答
我们是否尝试过调用.SaveOrUpdateCopy()?
如果会话中存在具有相同ID的实体,或者根本没有实体,则它应在所有情况下均有效。这基本上是万能的方法,因为它将瞬态对象转换为持久对象(保存),如果存在则更新对象(更新),或者如果实体是已经存在的对象的副本则进行处理(复制)。 。
否则,我们可能必须在添加(.Update())"新"对象之前,先识别和.Evict()。
这应该很容易做到:
IPersistable entity = Whatever(); // This is the object we're trying to update // (IPersistable has an id field) session.Evict(session.Get(entity.GetType(), entity.Id)); session.SaveOrUpdate(entity);
尽管上面的代码可能对.Get()调用进行了一些空检查。
回答
怎么样:
session.replicate(entity, ReplicationMode.OVERWRITE);
?