我正在使用JPA(1.0或2.)+ hibernate(3.4.0或3.6.0),我遇到了一个问题,我认为在某处缓存。我做了什么:
问题:
第一次调用时,更改会反映在getResultList中,但第二次显示之前的状态。第三次正确显示;第四,前一个州;每当我在表上调用getResultList时,它似乎在两个状态之间交替。
以上#3的一些代码:
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
entityManager.persist(object);
entityTransaction.commit();
entityManager.refresh(object);
#4代码:
Query query = entityManager.createQuery("from " + object.getName());
List<T> resultList = query.getResultList();
在努力解决问题时,我有:
1.使用以下命令在persistence.xml中关闭L2并查询缓存:
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
2.在使用(使用JPA 2.0)运行getResultList()之前强制执行缓存驱逐:
entityManager.getEntityManagerFactory().getCache().evictAll()
3.tried在整个地方调用refresh() - 没有效果。
我错过了什么吗?
任何帮助都将不胜感激。
谢谢, SOP
答案 0 :(得分:1)
我之前遇到过这个问题(或类似的东西)与一些不同的JPA提供商。确保您明确关闭了EntityManagers。
答案 1 :(得分:0)
我认为entityManager.refresh(object);
是不必要的。默认刷新模式为Auto,因此EntityManager将在执行查询时刷新(将持久性上下文与基础数据库同步)。
此外,每个查询是否需要来自数据库的SQL查询?
答案 2 :(得分:0)
嗯,史蒂文,实际上你的解决方案终于得到了帮助。在我的应用程序中,我从Servlet调用我的更新方法。在我调用任何方法之前,一旦关闭EntityManager,问题就消失了。我仍然不知道为什么会这样。
仔细检查问题后,我发现问题不是getResultList(),但是当我在更新它后对相关对象执行了find()时,find()将在两个之间交替具有不同哈希但具有相同ID的对象(不同的哈希值是设置或不设置布尔标志的结果。)
这仍然很奇怪,但一旦我找到合适的地方,史蒂文的建议就有用了。