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() 返回不同的数据的主要内容,如果未能解决你的问题,请参考以下文章

更改分组时Hibernate中查询的不同返回类型

为啥要在缓存中获取 EclipseLink JPA query.getResultList() 结果的正确原因是啥?

getResultList() 中的 IBM OpenJPA NullPointerException

javax.persistence.Query.getResultList() 可以返回 null 吗?

Query.getResultList() 即使sql表有行也不返回结果

是否可以使用 JPA 从 javax.persistence.Query.getResultList() 流式传输结果?