有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java hibernate getResultList()返回不同的数据

我与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();

在我努力解决这个问题的过程中,我有:

一,。在持久化中关闭二级缓存和查询缓存。包含以下内容的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


共 (2) 个答案

  1. # 1 楼答案

    我以前在几家不同的JPA提供商那里遇到过这个问题(或者类似的问题)。确保明确关闭EntityManager

  2. # 2 楼答案

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

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

    这仍然很奇怪,但史蒂文的建议在我找到合适的地方后就奏效了