Hibernate 休眠条件.list()和会话刷新

Hibernate 休眠条件.list()和会话刷新,hibernate,jboss,hibernate-criteria,Hibernate,Jboss,Hibernate Criteria,我正在使用jboss,我有一个类使用Hibernate条件查询来执行从数据库读取的实体 我已经用实现了这个查询 // org.hibernate.Criteria crit .. // crit.add(Restriction... // crit.setProjections(... List<MyObject> l = crit.list() 它工作,它刷新对象内容,更新的数据来自数据库而不是缓存。 但这是非常低效的,因为它会逐个刷新列表中的所有对象,而且它们可能很多 另一种方

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

我已经用实现了这个查询

// org.hibernate.Criteria crit ..
// crit.add(Restriction...
// crit.setProjections(...
List<MyObject> l = crit.list()
它工作,它刷新对象内容,更新的数据来自数据库而不是缓存。 但这是非常低效的,因为它会逐个刷新列表中的所有对象,而且它们可能很多

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

我尝试了Sessionem.getDelegate.setCacheModeCacheMode.REFRESH和crit.setCacheablefalse,但在这两种情况下,所有读取执行都会从缓存返回数据的“旧”版本

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


谢谢你

试试这个谢谢Pokuri,我试着用cacheMode忽略:第一次到达断点时,会话中的cacheMode设置为正常;将其设置为“忽略”,会话缓存模式下的每一次读取仍将被忽略,但数据仍然来自缓存。您可以使用事务隔离来处理此问题。您尝试读取未提交的隔离级别了吗?另一种方法是尝试无状态会话,它没有缓存,因此,您只能从数据库准备就绪。在这种情况下,我建议您创建另一个空类,扩展查询类并将其映射到hbm中,但这次没有缓存标记。使用这个新类,您需要一直点击DB来获取记录。
for (MyObject o : l) {
     ((Session)em.getDelegate()).refresh(o); 
}