1

如果已经有一个使用该标识符的对象加载到会话中,是否有任何方法可以使用 Hibernate 保存对象?

  • session.contains(obj)如果会话包含确切的对象,而不是具有相同 ID 的另一个对象,则Doing似乎只返回 true。
  • 如果对象是新的,则使用merge(obj)抛出异常
4

2 回答 2

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() 调用进行一些空值检查。

于 2008-08-25T17:32:23.343 回答
1

怎么样:

session.replicate(entity, ReplicationMode.OVERWRITE);

?

于 2008-09-02T21:51:01.970 回答