hibernate getResultList() 返回不同的数据
Posted
技术标签:
【中文标题】hibernate getResultList() 返回不同的数据【英文标题】:hibernate getResultList() returns varying data 【发布时间】:2010-10-21 00:40:53 【问题描述】:我正在使用 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();
在我努力解决问题的过程中,我有:
1.在persistence.xml中关闭L2和查询缓存:
<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
2.在运行 getResultList() 之前强制缓存驱逐(使用 JPA 2.0):
entityManager.getEntityManagerFactory().getCache().evictAll()
3. 尝试到处调用 refresh() - 无效。
我错过了什么吗?
任何帮助将不胜感激。
谢谢, 苏普
【问题讨论】:
提供一个允许重现的测试用例。 【参考方案1】:我之前在几个不同的 JPA 提供程序中遇到过这个问题(或类似的问题)。确保您明确关闭 EntityManagers。
【讨论】:
这有什么影响??持久性上下文是孤立的。 Pascal:我也不太确定,但我在 EclipseLink 和 Hibernate 以及陈旧数据与新数据交替时遇到了一个非常相似的问题,我尝试了 someOnePerson 尝试过的相同的事情(禁用二级缓存,查询缓存,显式驱逐缓存等),当我最终开始关闭我的 EntityManagers 时,问题立即消失并且从未再次发生。我希望它在这里也能有所帮助,因为问题的描述几乎相同。 我怀疑另一个实现问题。【参考方案2】:我不认为entityManager.refresh(object);
是必要的。默认刷新模式是自动,因此EntityManager会在查询执行时刷新(将持久化上下文同步到底层数据库)。
此外,每个查询是否都需要来自数据库的 SQL 查询?
【讨论】:
【参考方案3】:嗯,史蒂文,实际上你的解决方案最终确实起到了帮助作用。在我的应用程序中,我从 Servlet 调用我的更新方法。在我调用任何方法之前关闭 EntityManager 后问题就消失了。我仍然不知道为什么会这样。
在仔细检查问题后,我发现问题不是 getResultList(),但是当我在更新后对有问题的对象执行 find() 时,find() 会在两个具有不同哈希但 ID 相同的对象(不同的哈希是布尔标志设置与否的结果。)
这仍然很奇怪,但是一旦我找到了合适的地方,Steven 的建议就奏效了。
【讨论】:
我不知道这一切是如何实现的,但必须“在调用任何方法之前关闭 EntityManager”当然是不对的。你有一个潜在的问题,你只是在解决它。以上是关于hibernate getResultList() 返回不同的数据的主要内容,如果未能解决你的问题,请参考以下文章
为啥要在缓存中获取 EclipseLink JPA query.getResultList() 结果的正确原因是啥?
getResultList() 中的 IBM OpenJPA NullPointerException
javax.persistence.Query.getResultList() 可以返回 null 吗?
Query.getResultList() 即使sql表有行也不返回结果
是否可以使用 JPA 从 javax.persistence.Query.getResultList() 流式传输结果?