如果已经有一个对象使用加载到会话中的标识符,有没有办法使用Hibernate保存对象?
session.contains(obj)
似乎仅返回true。merge(obj)
会抛出异常答案 0 :(得分:4)
您是否尝试过调用.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()调用进行一些空检查。
答案 1 :(得分:1)
怎么样:
session.replicate(entity, ReplicationMode.OVERWRITE);