【问题标题】:hibernate getResultList() returns varying datahibernate getResultList() 返回不同的数据
【发布时间】:2010-10-21 00:40:53
【问题描述】:

我正在使用 JPA(1.0 或 2.)+hibernate(3.4.0 或 3.6.0),我遇到了我认为在某处缓存的问题。我做什么:

  1. 使用我的 JPA 类查找对象(数据库中具有特定 id 的行)
  2. 更新对象上的布尔标志(数据库中的tinyint字段)
  3. 持久化对象
  4. 使用 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() - 无效。

我错过了什么吗?

任何帮助将不胜感激。

谢谢, 苏普

【问题讨论】:

  • 提供一个允许重现的测试用例。

标签: java hibernate jpa caching persistence


【解决方案1】:

我之前在几个不同的 JPA 提供程序中遇到过这个问题(或类似的问题)。确保您明确关闭 EntityManagers。

【讨论】:

  • 这有什么影响??持久性上下文是孤立的。
  • Pascal:我也不太确定,但我在 EclipseLink 和 Hibernate 以及陈旧数据与新数据交替时遇到了一个非常相似的问题,我尝试了 someOnePerson 尝试过的相同的事情(禁用二级缓存,查询缓存,显式驱逐缓存等),当我最终开始关闭我的 EntityManagers 时,问题立即消失并且从未再次发生。我希望它在这里也能有所帮助,因为问题的描述几乎相同。
  • 我怀疑另一个实现问题。
【解决方案2】:

我不认为entityManager.refresh(object); 是必要的。默认刷新模式是自动,因此EntityManager会在查询执行时刷新(将持久化上下文同步到底层数据库)。

此外,每个查询是否都需要来自数据库的 SQL 查询?

【讨论】:

    【解决方案3】:

    嗯,史蒂文,实际上你的解决方案最终确实起到了帮助作用。在我的应用程序中,我从 Servlet 调用我的更新方法。在我调用任何方法之前关闭 EntityManager 后问题就消失了。我仍然不知道为什么会这样。

    在仔细检查问题后,我发现问题不是 getResultList(),但是当我在更新后对有问题的对象执行 find() 时,find() 会在两个具有不同哈希但 ID 相同的对象(不同的哈希是布尔标志设置与否的结果。)

    这仍然很奇怪,但是一旦我找到了合适的地方,Steven 的建议就奏效了。

    【讨论】:

    • 我不知道这一切是如何实现的,但必须“在调用任何方法之前关闭 EntityManager”当然是不对的。你有一个潜在的问题,你只是在解决它。
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2021-09-25
    • 2013-02-28
    相关资源
    最近更新 更多