Hibernate:安全地将对象重新附加到会话中

Rob*_*Rob 9 java hibernate

我通过在地图中存储(可能是分离的)对象来维护hibernate会话中的对象缓存.当缓存命中时,我测试对象是否已经是会话的一部分Session.contains(object).如果没有,我重新附上它Session.lock(object, LockMode.NONE).

问题是,如果先前在会话中加载了相同的对象,则会抛出org.hibernate.NonUniqueObjectException.给定一个分离的实例,我认为没有办法提前找出是否会抛出此异常,而不会触及数据库.

有几种解决方法:

  1. 在每个事务开始时重新附加所有缓存的对象.
  2. 捕获NonUniqueObjectException,然后调用session.load(object.class,object.getId());

这些都不像预先检查对象类+ id的会话一样干净.

有没有办法做到这一点?

Raj*_*Raj 4

Session.merge() 应该这样做:

obj = session.merge(obj);
Run Code Online (Sandbox Code Playgroud)

  • 我认为 merge() 会影响数据库,这是我希望避免的。请注意, session.lock(detached_object, LockMode.NONE) 根本不会命中数据库(如果您在重新附加后不更改它) (2认同)