JPA DescriptorEventAdapter ChangeSet toujours null

J’essaie d’inclure un suivi des modifications sur mes entités JPA (dans un fichier journal, pas une firebase database). Toutefois, le changeSet renvoyé par mon DescriptorEventAdapter est toujours nul. J’utilise EclipseLink 2.5.2, ojdbc6, spring-orm 4.1.1.

Tous les événements sont appelés (y compris preUpdateWithChanges) et les modifications sont placées dans la firebase database. J’utilise entityManager.merge (entité) pour mettre à jour l’entité.

HistoryEventListener.java

public class HistoryEventListener extends DescriptorEventAdapter { @Override public void preUpdate(DescriptorEvent event) { ObjectChangeSet changeSet = event.getChangeSet(); // Always null } @Override public void preUpdateWithChanges(DescriptorEvent event) { ObjectChangeSet changeSet = event.getChangeSet(); ... }; @Override public void postUpdate(DescriptorEvent event) { ... } @Override public void postMerge(DescriptorEvent event) { ... } } 

Une entité

 @Entity @Table(name = "XXX", schema = "XXX") @EntityListeners(HistoryEventListener.class) @Cache(databaseChangeNotificationType = DatabaseChangeNotificationType.NONE, isolation = CacheIsolationType.ISOLATED) public class XXXX implements Serializable { // id + fields } 

persistence.xml

   org.eclipse.persistence.jpa.PersistenceProvider jdbc/XXXXX false       

L’utilisation de UnitOfWork à partir du wiki eclipse renvoie également un Null ObjectChangeSet.

La lecture de event.getQuery () fonctionne. Aucune idée pourquoi event.getChangeSet () est vide, mais voici comment je l’ai résolu.

 public void preUpdateWithChanges(DescriptorEvent event) { if (event.getQuery() instanceof UpdateObjectQuery) { UpdateObjectQuery query = (UpdateObjectQuery) event.getQuery(); for (ChangeRecord cr : query.getObjectChangeSet().getChanges()) { Ssortingng clazz = query.getObject().getClass().getSimpleName(); Object id = query.getObjectChangeSet().getId(); Object newValue = PropertyUtils.getProperty(query.getObject(), cr.getAtsortingbute()); Object oldVal = cr.getOldValue(); } } 

Dans la documentation de l’API pour DescriptorEventAdapter.preUpdate:

Cet événement est déclenché avant que les modifications de l’object ne soient calculées ….

(Le gras est mon ajout.)

Dans la documentation de DescriptorEvent.changeSet:

Pour l’événement post-fusion , il est possible qu’un ensemble de modifications ait été généré.

Que se passe-t-il dans votre remplacement postMerge ()?