Откат и кэш сбора 2-го уровня - PullRequest
1 голос
/ 23 февраля 2011

У меня Hibernate с кэшем 2-го уровня, предоставленным 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 сделать это для меня с минимальным воздействием.

1 Ответ

0 голосов
/ 24 февраля 2011

Менеджер транзакций Hibernate довольно прост, и из того, что вы описали, похоже, он не справляется с этим делом.Причина проста: Hibernate не пытается внедрить JTA сам по себе, поскольку существует множество провайдеров JTA.Таким образом, если вы используете сервер приложений, такой как JBoss AS, вы можете настроить Hibernate и EHCache на использование своего провайдера JTA, который наверняка справится с этой ситуацией.

Кроме того, я считаю, что объект помещается вкеш методом "flush".Так что, если вы не хотите использовать JTA-провайдера и если этот «сброс» действительно не нужен, я удалил бы эту часть.

...