2016-02-22 9 views
10

Ich versuche, einen Änderungsverfolger in meine JPA-Entitäten aufzunehmen (in eine Protokolldatei, keine Datenbank), aber der von meinem DescriptorEventAdapter zurückgegebene changeSet ist immer null. Ich verwende EclipseLink 2.5.2, ojdbc6, spring-orm 4.1.1.JPA DescriptorEventAdapter ChangeSet immer null

Alle Ereignisse werden aufgerufen (einschließlich preUpdateWithChanges) und die Änderungen werden in die Datenbank übertragen. Ich verwende entityManager.merge (entity), um die Entität zu aktualisieren.

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) { 
     ... 
    } 
} 

Einige Unternehmen

@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> 

Mit UnitOfWork von eclipse wiki gibt auch eine Null ObjectChangeSet.

+0

Funktioniert es wie erwartet, wenn Sie die Cache-Annotation entfernen? – Chris

+0

nein, gleiches Ergebnis. Nein ChangeSet – Martin

+1

Abgesehen vom ChangeSet wird der Rest des DescriptorEvent wie erwartet gefüllt? –

Antwort

3

Das Lesen der event.getQuery() funktioniert. Keine Ahnung, warum das event.getChangeSet() empty ist, aber so habe ich es gelöst.

0

Von der API-Dokumentation für DescriptorEventAdapter.preUpdate:

Dieses Ereignis vor sind Gegenstand angehoben wird, um Änderungen des berechneten ....

(Die bolding ist mein Zusatz.)

Aus der Dokumentation für DeskriptorEvent.changeSet:

Für das Post Merge Ereignis ist es möglich, dass ein Änderungssatz generiert wurde.

Was passiert in Ihrem postMerge() überschreiben?

+0

Alle von allen Überschreibungen zurückgegebenen Änderungsmengen (postMerge, postUpdate, preUpdateWithChanges, preUpdate) sind null :( – Martin