2016-02-22 36 views
10

Sto tentando di includere un tracker delle modifiche alle mie entità JPA (in un file di registro, non in un database) tuttavia il set di modifiche restituito dal mio DescriptorEventAdapter è sempre nullo. Sto usando EclipseLink 2.5.2, ojdbc6, spring-orm 4.1.1.JPA DescriptorEventAdapter ChangeSet sempre nullo

Tutti gli eventi vengono chiamati (incluso preUpdateWithChanges) e le modifiche vengono inviate al database. Sto usando entityManager.merge (entità) per aggiornare 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) { 
     ... 
    } 
} 

qualche 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

<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

    <persistence-unit name="XXXXXX" 
     transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/XXXXX</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="eclipselink.weaving" value="static" /> 
      <property name="eclipselink.target-database" value="Oracle11" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Utilizzando UnitOfWork da eclipse wiki restituisce un Null ObjectChangeSet.

+0

Funziona come ci si aspetterebbe se si rimuovesse l'annotazione Cache? – Chris

+0

no, stesso risultato. No ChangeSet – Martin

+1

Oltre a ChangeSet, il resto del DescriptorEvent è popolato come previsto? –

risposta

3

Leggere l'evento.getQuery() funziona. Non ho idea del perché l'event.getChangeSet() sia emtpy, ma è così che ho risolto.

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

Dalla documentazione API per DescriptorEventAdapter.preUpdate:

Questo evento viene generato prima modifiche dell'oggetto vengono calcolate ....

(Il grassetto è la mia aggiunta.)

Dalla documentazione per DescriptorEvent.changeSet:

Per l'evento di post-unione è possibile che sia stato generato un set di modifiche.

Cosa succede nel tuo override postMerge()?

+0

Tutti i gruppi di modifiche restituiti da tutti gli overrides (postMerge, postUpdate, preUpdateWithChanges, preUpdate) sono null :( – Martin

Problemi correlati