Лучшая практика для запросов внутри прослушивателей событий в Hibernate

У нас есть FlushEventListener для выполнения функций аудита. При обновлении некоторого объекта hibernate будет вызывать наш код аудита непосредственно перед очисткой. Код аудита должен запрашивать базу данных.

Если мы попытаемся сделать это в том же сеансе, очевидно, мы испортим состояние сеанса: мы получим исключение NullPointerException из спящего режима в какой-то момент, когда он проверяет naturalId внутри класса с именем NaturalIdXrefDelegate.

В настоящее время мы решили эту проблему, открыв новый сеанс для аудиторского запроса. Проблема в том, что мы теряем преимущество getCurrentSession (сессия для всего запроса, управляемая hibernate). Таким образом, мы вернемся к открытию одного сеанса для каждого запроса.

Есть ли элегантное решение для этого, или нам в основном нужно повторно реализовать getCurrentSession для управления нашим собственным сеансом № 2 в запросе?


person Vituel    schedule 19.08.2014    source источник
comment
Вы решили это? У меня тот же вопрос, но ответа на него пока нет.   -  person meetnick    schedule 21.11.2014
comment
Ответьте на вопрос, если вы его решили. У меня такая же проблема.   -  person dagi12    schedule 09.04.2018


Ответы (1)


Вам не нужно открывать новую сессию. Достаточно временно отключить флеш.

Session session = entityManager.unwrap(Session.class);
session.setHibernateFlushMode(FlushMode.MANUAL);
// do your db stuff
session.setHibernateFlushMode(FlushMode.AUTO);

На самом деле это намного быстрее, чем

session.getSessionFactory().openSession()

Что работает, кстати.

person dagi12    schedule 08.04.2018