2010-10-21 112 views
1

我正在使用JPA(1.0或2)+ hibernate(3.4.0或3.6.0),我遇到了一个问题,我想在某处缓存。我做什么:hibernate getResultList()返回不同的数据

  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.Turned L2和在persistence.xml中关闭查询缓存:

<property name="hibernate.cache.use_query_cache" value="false"/> 
<property name="hibernate.cache.use_second_level_cache" value="false"/> 

2.forced缓存驱逐与(使用JPA 2.0)运行getResultList()之前:

entityManager.getEntityManagerFactory().getCache().evictAll() 

3.tried调用刷新()所有的地方 - 没有效果。

我错过了什么吗?

任何帮助,将不胜感激。

感谢, SOP

+0

提供允许重现的测试用例。 – 2010-10-21 19:55:53

回答

0

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

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

1

我以前遇到过这个问题(或者与几个不同的JPA提供者很相似)。确保你明确地关闭你的EntityManagers。

+0

这怎么会影响到什么?持久性上下文是孤立的。 – 2010-10-21 19:56:45

+0

Pascal:我也不太确定,但是我遇到了一个与EclipseLink和Hibernate非常类似的问题,旧数据与新数据交替出现,我尝试了一些与OneOnePerson尝试的相同的事情(禁用二级缓存,查询缓存,明确驱逐缓存等),当我最终开始关闭我的EntityManagers时,问题立即消失,并且从未再次发生。我希望它也能在这里得到帮助,因为问题的描述几乎完全相同。 – 2010-10-22 01:08:04

+0

我怀疑另一个实现问题。 – 2010-10-23 17:30:42

0

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

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

这仍然很奇怪,但Steven的建议一旦找到合适的位置就可以实现。

+0

我不知道所有这些如何实现整个事情,但必须“在调用任何方法之前关闭EntityManager”肯定是不正确的。你有一个潜在的问题,你只是在解决它。 – 2010-10-23 17:32:46

相关问题