У меня есть требование установить значение date_updated
в моей базе данных для каждой строки, когда эта строка обновляется. Назовем объект, с которым я работаю с Order
, который имеет соответствующую таблицу orders
в базе данных.Как выполнить именованные запросы из JPA EntityListener?
Я добавил колонку date_updated
в таблицу orders
. Все идет нормально.
@Entity Order
объект, с которым я работаю, предоставляется третьей стороной. У меня нет возможности изменять исходный код, чтобы добавить поле под названием dateUpdated
. У меня нет требования сопоставлять это значение с объектом в любом случае - это значение будет использоваться только для целей бизнес-аналитики и не должно быть представлено в объекте сущности Java.
Моя проблема заключается в следующем: я хочу обновить столбец date_updated
в базе данных до текущего времени каждый раз, когда изменяется объект Order
(и соответствующая строка таблицы базы данных).
Ограничения:
- Мы используем Oracle, Spring, JPA и Hibernate
- Я не могу использовать Oracle триггеры для обновления значения. Мы используем технологию репликации базы данных, которая не позволяет нам использовать триггеры.
Мой подход до сих пор было использовать JPA EntityListener, определенный в XML, похожее на это:
<entity-mappings xmlns="....">
<entity class="com.theirs.OrderImpl">
<entity-listeners>
<entity-listener class="com.mine.listener.OrderJPAListener" />
</entity-listeners>
</entity>
</entity-mappings>
Мой класс слушатель выглядит следующим образом:
public class OrderJPAListener {
@PostPersist
@PostUpdate
public void recordDateUpdated(Order order) {
// do the update here
}
}
Проблема I У меня есть инъекция какой-либо поддержки настойчивости (или вообще чего-либо вообще) в моего слушателя. Поскольку JPA загружает слушателя с помощью своих методов, у меня нет доступа к каким-либо весенним бобам в моем классе слушателя.
Как мне ввести инъекцию EntityManager
(или любой весенний боб) в мой класс слушателя, чтобы я мог выполнить именованный запрос для обновления поля date_updated
?
Я закончил работу с чем-то похожим на решение guylabs.ch, используя функцию Spring для автоподготовки существующего экземпляра. Как оказалось, Spring достаточно умен, чтобы автоповолить поля, аннотированные с @PersistenceUnit. –