如果已经有一个使用该标识符的对象加载到会话中,是否有任何方法可以使用 Hibernate 保存对象?
session.contains(obj)
如果会话包含确切的对象,而不是具有相同 ID 的另一个对象,则Doing似乎只返回 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);
?