Hibernate saveOrUpdate与会话中的另一个对象

时间:2008-08-25 17:25:23

标签: hibernate orm

如果已经有一个对象使用加载到会话中的标识符,有没有办法使用Hibernate保存对象?

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

2 个答案:

答案 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);