Перехватчик Java EE 6 для обновления объекта JPA 2 после завершения транзакции

В разрабатываемом приложении у нас есть иерархия объектов:

CampaignStatus <- Campaign -> CampaignItem*

Проще говоря, у меня есть Campaign который имеет несколько CampaignItemх, каждый Campaign имеет CampaignStatus это рассчитывается на основе количества элементов в данной кампании или по другим параметрам. Короче говоря, мне нужно обновить статус кампании для данной кампании после того, как изменения, связанные с элементом, будут сохранены в БД.

По моему мнению, это звучит как подходящая почва для работы с аспектами / перехватчиками, но я не знаю, является ли это хорошей практикой.

Q: так ли это?

Q: я могу вызвать перехватчик после совершения транзакции?

2 ответа

Решение
  1. Нет. Это бизнес-требование, которое должно быть реализовано на вашем бизнес-уровне. Просто убедитесь, что все обновления кампании выполняются данным сервисом, и сделайте так, чтобы этот сервис также соответствующим образом обновлял статус.

  2. Вы действительно хотите, чтобы ваша база данных была в согласованном состоянии. Поэтому кампания и ее статус должны быть обновлены в одной транзакции. В противном случае вам может потребоваться обновить кампанию, а затем не обновить состояние, что приведет к тому, что база данных окажется в непоследовательном состоянии. Вот что такое транзакции.

Вы можете попробовать обратные вызовы EntityListener @PostPersist и @PostUpdate (проверьте эту ссылку). Другим решением было бы использование бизнес-логики в БД с использованием триггера (я бы не рекомендовал это, поскольку у вас могут быть проблемы с тупиками).

Другие вопросы по тегам