我正在使用 jboss,并且我有一个使用 Hibernate 标准查询的类来执行从数据库读取的实体。
我已经实现了查询
// org.hibernate.Criteria crit ..
// crit.add(Restriction...
// crit.setProjections(...
List<MyObject> l = crit.list()
在应用程序执行期间,另一个应用程序更改了数据库内容。因此,如果我在与另一个 c.list() 的同一会话中再次读取数据似乎没有改变,因为休眠缓存将“旧”数据返回给我。
通过刷新,我可以执行类似的操作(从 EntityManager em 开始获取 Session):
for (MyObject o : l) {
((Session)em.getDelegate()).refresh(o);
}
它可以工作,它刷新对象内容,更新的数据来自数据库而不是缓存。但这是非常低效的,因为它会一一刷新列表中的所有对象,而且它们可能很多。
另一种方法是关闭并重新打开会话,但我不会这样做。
我尝试使用((Session)em.getDelegate()).setCacheMode(CacheMode.REFRESH)
和使用,crit.setCacheable(false)
但在这两种情况下,所有读取执行都会返回给我缓存中数据的“旧”版本。
您是否有任何建议,在会话/条件中设置以从数据库执行查询,而不是从缓存?在我的应用程序使用中,缓存是可以的,除了在上面解释的一种情况下,数据库上的数据是从外部,从另一个应用程序的另一个会话更改的。
谢谢