2

我有 Hibernate 和 Ehcache 提供的二级缓存。

我有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 为我做这件事,影响最小。

4

1 回答 1

0

Hibernate 事务管理器非常简单,根据您的描述,它似乎无法处理这种情况。原因很简单:Hibernate 并没有尝试自己实现 JTA,因为那里有很多 JTA 提供者。因此,如果您使用 JBoss AS 之类的应用程序服务器,您可以配置 Hibernate 和 EHCache 以使用其 JTA 提供程序,这肯定会处理这种情况。

另外,我相信实体正在通过“刷新”方法放入缓存中。因此,如果您不想使用 JTA 提供程序,并且除非确实需要这种“刷新”,否则我会删除该部分。

于 2011-02-24T06:33:24.007 回答