绕过事务中的Hibernate缓存

时间:2009-12-29 05:31:33

标签: java hibernate jpa

我有一个奇怪的Hibernate用例,在一个大堆栈的调用中需要一个未修改的对象副本,这是一个hibernate事务的一部分。但是,每次我向Hibernate询问该对象的副本时,它都会返回已经修改过的版本/是该事务的一部分。

我有办法强制Hibernate返回有问题的对象的db copy / uncached版本吗?

3 个答案:

答案 0 :(得分:3)

打开一个新的Session并从新Session获取该对象的副本。

答案 1 :(得分:3)

Session#refresh(Object object);
  

从底层数据库重新读取给定实例的状态。

或者您可以调用session.evict(obj)(将其从会话缓存中删除)并重新load()

请注意,如果您使用EntityManager代替Session,则不会使用evict()方法。您可以通过以下方式获取Session

Session session = (Session) entityManager.getDelegate();

答案 2 :(得分:0)

如果您不关心hibernate缓存,请使用无状态会话来执行查询。 Google Hibernate无状态会话获取详细信息。