2017-01-09 7 views
1

У меня есть проект, который использует Hibernate. Все объекты, сопоставленные (с аннотациями) в пакете персистентности, автоматически обновляются в конце транзакционных методов, если они изменены.Трибуны массового обновления JPA TransactionalEventListener?

Я хочу выполнить массовое обновление с CriteraUpdate из JPA 2.1, но мне нужно изменить объекты, чтобы вызвать TransactionalEventListeners из Spring. Если я изменяю объекты и не вызываю никаких методов сохранения, спящий режим будет сохраняться каждый объект, хотя я использовал JPA?

Кроме того, я не знаю, будет ли TransactionalEventListener работать с жизненным циклом JPA вместо Hibernate (я реализую интерфейс ApplicationEventPublisherAware).

+0

Можете ли вы приложить транзакционный метод, а также класс слушателя? Также какую версию Spring вы используете? –

ответ

1

Если вы используете методы JPA для операций orm, я ожидаю, что вы используете интерфейс EntityManager.

Это хороший подход, поскольку вы взаимодействуете с API вместо реализации (являетесь классом Session Hibernates). За кулисами EntityManager все равно вызывает класс Session и действует как декоратор, поэтому Hibernate выполняет всю работу.

Если вы весите транзакционные бобы, которые правильно настроены для работы с SessionFactory Hibernate, то слушатель должен улавливать события.

Единственное, что я могу придумать, это то, что при запуске массовых операций сохраняется PersistenceContext JPA, в отличие от операций и запросов одного элемента dml. Все транзакции все еще обернуты, так что, опять же, необходимо вызвать слушателя.

Просто, чтобы быть уверенным, поместите этот флаг на @TransactionalEventListener как спецификация предполагает, что в случае отмены сделки присутствуя:

Если событие не публикуется в границах управляемой сделки, событие отбрасывается, если явно не установлен флаг fallbackExecution().

Смежные вопросы