我有Hibernate和Ehcache提供的二级缓存。
我有Parent
和Child
个类,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 :(得分:0)
Hibernate事务管理器非常简单,根据您的描述,它似乎无法处理这种情况。原因很简单:Hibernate本身并没有尝试实现JTA,因为那里有很多JTA提供商。因此,如果您使用的是JBoss AS之类的应用程序服务器,则可以将Hibernate和EHCache配置为使用其JTA提供程序,这肯定会处理这种情况。
另外,我相信实体是通过“flush”方法放入缓存的。因此,如果您不想使用JTA提供程序,除非确实需要“刷新”,否则我将删除该部分。