hibernate getResultList()返回不同的数据

时间:2010-10-21 00:40:53

标签: java hibernate jpa caching persistence

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

  1. 使用我的JPA类(具有特定ID的数据库中的行)查找对象
  2. 更新对象上的布尔标志(数据库中的tinyint字段)
  3. 坚持对象
  4. 使用getResultList()从数据库中获取整个表,希望能够反映出更改。
  5. 问题:

    第一次调用时,更改会反映在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

3 个答案:

答案 0 :(得分:1)

我之前遇到过这个问题(或类似的东西)与一些不同的JPA提供商。确保您明确关闭了EntityManagers。

答案 1 :(得分:0)

我认为entityManager.refresh(object);是不必要的。默认刷新模式为Auto,因此EntityManager将在执行查询时刷新(将持久性上下文与基础数据库同步)。

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

答案 2 :(得分:0)

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

仔细检查问题后,我发现问题不是getResultList(),但是当我在更新它后对相关对象执行了find()时,find()将在两个之间交替具有不同哈希但具有相同ID的对象(不同的哈希值是设置或不设置布尔标志的结果。)

这仍然很奇怪,但一旦我找到合适的地方,史蒂文的建议就有用了。