Hibernate criteria.list()和Session刷新

时间:2013-10-25 12:16:20

标签: hibernate jboss hibernate-criteria

我正在使用jboss,我有一个使用Hibernate条件查询的类来执行从db读取实体。

我用

实现了查询
// org.hibernate.Criteria crit ..
// crit.add(Restriction...
// crit.setProjections(...
List<MyObject> l = crit.list()

在应用程序执行期间,另一个应用程序更改数据库内容。 因此,如果我在与另一个c.list()的同一会话中再次读取数据似乎没有改变,因为hibernate缓存会向我返回“旧”数据。

通过刷新我可以做类似的事情(从EntityManager em开始获取Session):

for (MyObject o : l) {
     ((Session)em.getDelegate()).refresh(o); 
}

它工作,它刷新对象内容,更新的数据来自db而不是来自缓存。 但这是非常低效的,因为它逐个刷新列表中的所有对象,并且它们可能很多。

另一种方法是关闭并重新打开会话,但我不会这样做。

我尝试使用((Session)em.getDelegate()).setCacheMode(CacheMode.REFRESH)crit.setCacheable(false),但在这两种情况下,所有读取执行都会向我返回缓存中数据的“旧”版本。

您是否有任何建议,在会话/条件中设置从db执行查询而不是从缓存执行查询?在我的应用程序使用中,缓存是可以的,除了上面解释的一种情况,其中数据库上的数据从外部更改,从另一个应用程序的另一个会话更改。

谢谢

0 个答案:

没有答案