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

Java hibernate getResultList()返回不同的数据,java,hibernate,jpa,caching,persistence,Java,Hibernate,Jpa,Caching,Persistence,我正在使用JPA(1.0或2.)+hibernate(3.4.0或3.6.0),我认为缓存在某个地方遇到了问题。我所做的: 查找具有我的JPA类的对象(数据库中具有特定id的行) 更新对象上的布尔标志(数据库中的tinyint字段) 持久化对象 使用getResultList()从数据库中获取整个表,希望反映更改 问题: 在我第一次调用getResultList时,它会反映更改,但在第二次调用时,它会显示以前的状态。第三次显示正确;第四,前一种状态;等。每次调用表上的getResultList时

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

  • 查找具有我的JPA类的对象(数据库中具有特定id的行)
  • 更新对象上的布尔标志(数据库中的tinyint字段)
  • 持久化对象
  • 使用getResultList()从数据库中获取整个表,希望反映更改
  • 问题:

    在我第一次调用getResultList时,它会反映更改,但在第二次调用时,它会显示以前的状态。第三次显示正确;第四,前一种状态;等。每次调用表上的getResultList时,这两种状态似乎会交替出现

    上述#3的一些代码:

    #4的代码:

    3.尝试到处调用refresh(),但没有效果

    我错过什么了吗

    任何帮助都将不胜感激

    谢谢,
    sop

    我不认为
    实体管理器刷新(对象)是必需的。默认刷新模式为自动,因此EntityManager将在查询执行时刷新(将持久性上下文同步到基础数据库)


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

    我不认为
    entityManager.refresh(对象)是必需的。默认刷新模式为自动,因此EntityManager将在查询执行时刷新(将持久性上下文同步到基础数据库)


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

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

    我以前在几个不同的JPA提供商中遇到过这个问题(或非常类似的问题)。确保您明确关闭了EntityManager。

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

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


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

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

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


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

    提供一个允许复制的测试用例。提供一个允许复制的测试用例。这会对任何事情产生什么影响??Pascal:我也不太确定,但我遇到了一个非常类似的问题,EclipseLink和Hibernate以及陈旧数据与新数据交替出现,我尝试了一些人尝试过的事情(禁用二级缓存、查询缓存、显式退出缓存等)当我终于开始关闭我的EntityManager时,问题立刻消失了,再也没有出现过。我希望它在这里也会有所帮助,因为对问题的描述几乎相同。我怀疑还有另一个实现问题。这会对任何事情产生什么影响??Pascal:我也不太确定,但我遇到了一个非常类似的问题,EclipseLink和Hibernate以及陈旧数据与新数据交替出现,我尝试了一些人尝试过的事情(禁用二级缓存、查询缓存、显式退出缓存等)当我终于开始关闭我的EntityManager时,问题立刻消失了,再也没有出现过。我希望它在这里也会有所帮助,因为对问题的描述几乎相同。我怀疑还有另一个实现问题。我不知道整个过程是如何实现的,但必须“在调用任何方法之前关闭EntityManager”肯定是不对的。你有一个潜在的问题,你只是在解决它。我不知道整个事情是如何实现的,但必须“在调用任何方法之前关闭EntityManager”肯定是不对的。你有一个潜在的问题,你只是在解决它。
    EntityTransaction entityTransaction = entityManager.getTransaction();
    entityTransaction.begin();
    entityManager.persist(object);
    entityTransaction.commit();
    entityManager.refresh(object);
    
    Query query = entityManager.createQuery("from " + object.getName());
    List<T> resultList = query.getResultList();
    
    <property name="hibernate.cache.use_query_cache" value="false"/>
    <property name="hibernate.cache.use_second_level_cache" value="false"/>
    
    entityManager.getEntityManagerFactory().getCache().evictAll()