Как определить изменения свойств сущности EJB в @PreUpdate? - PullRequest
5 голосов
/ 13 января 2011

при сохранении (обновлении) сущности вы вызываете EntityManager.persist (entity) , передавая полную сущность Можно перехватить с @PreUpdate.

У кого-нибудь есть рецепт, как определить, какие свойства изменились в этом методе перехватчика? Как-то сравнивая старую и новую сущность? Еще лучше реализовать универсальный метод, а не сравнивать поле за полем для каждого класса.

Спасибо за любой вклад!

Sven

1 Ответ

3 голосов
/ 13 января 2011

Прежде всего, persist () для новых объектов (вставка) не обновляется.Любой объект, измененный в контексте постоянства, будет автоматически обновлен.

JPA не предоставляет никакого стандартного способа узнать, что изменилось.Поэтому вам нужно либо отслеживать изменения самостоятельно, либо использовать API-интерфейс, специфичный для провайдера JPA.

В EclipseLink, если вы используете событие preUpdate EclipseLink DescriptorEventListener вместо JPA, вы получаете объект ObjectChangeSet, присоединенный к DescriptorEvent, который содержитизменения.

Другой способ в JPA, если вы используете ткачество, - привести ваш объект к ChangeTracker и вызвать _persistence_getPropertyChangeListener (), затем getObjectChangeSet ().

Если вы используете TopLink Essentials, то дескрипторсобытия также применяются, но отслеживание изменений не было сплетено.

...