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

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

===============>>#1 票数: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()调用进行一些null检查。

===============>>#2 票数:1

怎么样:

session.replicate(entity, ReplicationMode.OVERWRITE);

  ask by qwerty translate from so

未解决问题?本站智能推荐: