【发布时间】:2011-02-13 09:29:47
【问题描述】:
我通过在地图中存储(可能是分离的)对象来维护跨休眠会话的对象缓存。当缓存被命中时,我测试该对象是否已经是与Session.contains(object) 的会话的一部分。如果没有,我用Session.lock(object, LockMode.NONE) 重新附加它。
问题是,如果之前在会话中加载了相同的对象,它会抛出 org.hibernate.NonUniqueObjectException。给定一个分离的实例,我认为没有办法提前找出是否会引发此异常,而不会影响数据库。
有几种解决方法:
- 在每个事务开始时重新附加所有缓存的对象。
- 捕获 NonUniqueObjectException 然后调用 session.load(object.class, object.getId());
这些都不像提前检查会话中的对象类 + id 那样干净。
有没有办法做到这一点?
【问题讨论】:
-
一个疑问:如果对象已经加载,也许它比缓存的版本更新,那么当你捕捉到 NonUniqueObjectException 时为什么不更新缓存呢?