如果已经有一个使用该标识符的对象加载到 session 中,是否有任何方法可以使用 Hibernate 保存对象?
- 执行
session.contains(obj)
似乎仅当 session 包含该确切对象(而不是具有相同 ID 的另一个对象)时才返回 true。 - 如果对象是新的,则使用
merge(obj)
会引发异常
最佳答案
您是否尝试过调用.SaveOrUpdateCopy()? 如果 session 中存在具有相同 id 的实体或者根本没有实体,它应该在所有实例中都有效。这基本上是一种包罗万象的方法,因为它将 transient 对象转换为持久对象(保存),更新对象(如果存在)(更新),甚至处理实体是否是已存在对象的副本(复制) .
如果做不到这一点,您可能必须在附加(.Update())您的"new"对象之前识别并 .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() 调用进行一些空检查。
关于Hibernate saveOrUpdate 与 session 中的另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26450/