java hibernate getResultList()返回不同的数据
我与JPA(1.0或2.)合作hibernate(3.4.0或3.6.0)和我在某个地方遇到了缓存问题。我所做的:
- 使用我的JPA类查找对象(数据库中具有特定id的行)
- 更新对象上的布尔标志(数据库中的tinyint字段)
- 持久化对象
- 使用getResultList()从数据库中获取整个表,希望反映出更改李>
问题:
在我第一次调用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();
在我努力解决这个问题的过程中,我有:
一,。在持久化中关闭二级缓存和查询缓存。包含以下内容的xml:
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
二,。在使用(使用JPA 2.0)运行getResultList()之前强制执行缓存逐出:
entityManager.getEntityManagerFactory().getCache().evictAll()
三,。尝试到处调用refresh(),但没有效果
我错过什么了吗
任何帮助都将不胜感激
谢谢, sop
# 1 楼答案
我以前在几家不同的JPA提供商那里遇到过这个问题(或者类似的问题)。确保明确关闭EntityManager
# 2 楼答案
史蒂文,事实上你的解决方案最终起到了作用。在我的应用程序中,我从Servlet调用我的更新方法。在调用任何方法之前,我一关闭EntityManager,问题就消失了。我还是不知道为什么会这样
仔细检查这个问题后,我发现问题不在于getResultList(),而是当我在更新相关对象后对其执行find()时,find()会在两个具有不同哈希但ID相同的对象之间交替(不同的哈希是设置或不设置布尔标志的结果)
这仍然很奇怪,但史蒂文的建议在我找到合适的地方后就奏效了