2011-02-23 61 views
1

我有通过的Ehcache提供的2级高速缓存休眠。回滚和二级缓存收集

我有ParentChild类,有Parent.children缓存集合。

当我执行下面的代码:

Session session = DataSessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
Parent parent = // load from Session 
Child child = new Child(); 
child.setParent(parent); 
session.saveOrUpdate(child); 
session.flush(); 
session.refresh(parent); 
tx.rollback(); 
session.close(); 

session = DataSessionFactory.openSession(); 
tx = session.beginTransaction(); 
parent = session.load(Parent.class, parent.getId()); 
System.out.println(parent.getChildren()); 

最后一行失败并抛出异常,试图加载Child不存在。经过调查,我发现原因是它试图加载Child已经创建并在以前的事务回滚。

什么是配置缓存,或回滚事务的正确方法,使集合缓存清除正确?我不想清除回滚上的所有收集缓存,谢谢。寻找一种方法让Hibernate或Ehcache以最小的影响为我做到这一点。

回答

0

Hibernate的事务管理器是你所描述的很简单,从,似乎它不处理这种情况。原因很简单:Hibernate并没有试图单独实现JTA,因为有很多JTA提供者。所以,如果你正在使用像JBoss AS应用服务器,您可以配置Hibernate和的EHCache使用其JTA商,这肯定会处理这种情况。

而且,我相信,实体正被放入高速缓存被“刷新”的方法。因此,如果您不想使用JTA提供程序,并且除非确实需要此“刷新”,否则我会删除该部分。

+0

没错。如果没有“冲洗”它的作品,但不幸的是我后来真的需要它的一些选择。 – 2011-02-24 12:25:16

+0

所以,我认为你唯一的选择是使用一些JTA提供者。 – jpkrohling 2011-02-24 13:53:10