Java hibernate getResultList()返回不同的数据
我正在使用JPA(1.0或2.)+hibernate(3.4.0或3.6.0),我认为缓存在某个地方遇到了问题。我所做的: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时
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()