Перехватчик Java EE 6 для обновления объекта JPA 2 после завершения транзакции
В разрабатываемом приложении у нас есть иерархия объектов:
CampaignStatus <- Campaign -> CampaignItem*
Проще говоря, у меня есть Campaign
который имеет несколько CampaignItem
х, каждый Campaign
имеет CampaignStatus
это рассчитывается на основе количества элементов в данной кампании или по другим параметрам. Короче говоря, мне нужно обновить статус кампании для данной кампании после того, как изменения, связанные с элементом, будут сохранены в БД.
По моему мнению, это звучит как подходящая почва для работы с аспектами / перехватчиками, но я не знаю, является ли это хорошей практикой.
Q: так ли это?
Q: я могу вызвать перехватчик после совершения транзакции?
2 ответа
Нет. Это бизнес-требование, которое должно быть реализовано на вашем бизнес-уровне. Просто убедитесь, что все обновления кампании выполняются данным сервисом, и сделайте так, чтобы этот сервис также соответствующим образом обновлял статус.
Вы действительно хотите, чтобы ваша база данных была в согласованном состоянии. Поэтому кампания и ее статус должны быть обновлены в одной транзакции. В противном случае вам может потребоваться обновить кампанию, а затем не обновить состояние, что приведет к тому, что база данных окажется в непоследовательном состоянии. Вот что такое транзакции.
Вы можете попробовать обратные вызовы EntityListener @PostPersist и @PostUpdate (проверьте эту ссылку). Другим решением было бы использование бизнес-логики в БД с использованием триггера (я бы не рекомендовал это, поскольку у вас могут быть проблемы с тупиками).