【发布时间】:2010-09-06 18:55:03
【问题描述】:
如果已经有使用该标识符的对象加载到会话中,是否有任何方法可以使用 Hibernate 保存对象?
-
session.contains(obj)似乎只在会话包含该确切对象而不是具有相同 ID 的另一个对象时返回 true。 - 如果对象是新的,使用
merge(obj)会引发异常
【问题讨论】:
如果已经有使用该标识符的对象加载到会话中,是否有任何方法可以使用 Hibernate 保存对象?
session.contains(obj) 似乎只在会话包含该确切对象而不是具有相同 ID 的另一个对象时返回 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);
?
【讨论】: