2016-02-22 16 views
10

Próbuję dołączyć moduł śledzenia zmian do moich jednostek JPA (do pliku dziennika, a nie do bazy danych), ale zestaw zmian zwracany przez mój DescriptorEventAdapter ma zawsze wartość NULL. Używam EclipseLink 2.5.2, ojdbc6, spring-orm 4.1.1.JPA DescriptorEventAdapter ChangeSet zawsze ma wartość null

Wszystkie zdarzenia są wywoływane (w tym preUpdateWithChanges), a zmiany są przekazywane do bazy danych. Używam entityManager.merge (entity) do aktualizacji encji.

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

Niektóre jednostka

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

Korzystanie UnitOfWork z eclipse wiki zwraca również Null ObjectChangeSet.

+0

Czy działa tak, jak można by się spodziewać po usunięciu adnotacji z pamięci podręcznej? – Chris

+0

nie, ten sam wynik. No ChangeSet – Martin

+1

Poza ChangeSet, czy reszta DescriptorEvent została zapełniona zgodnie z oczekiwaniami? –

Odpowiedz

3

Odczytywanie właściwości event.getQuery() działa. Nie mam pojęcia, dlaczego event.getChangeSet() jest emtpy, ale tak to rozwiązałem.

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

Z dokumentacji API dla DescriptorEventAdapter.preUpdate:

To zdarzenie jest wywoływane przed zmiany tego obiektu są obliczane ....

(pogrubienie to mój dodatek).

Z dokumentacji DescriptorEvent.changeSet:

Dla po scaleniu Jeśli możliwe, że został wygenerowany zestaw zmian.

Co dzieje się w Twoim overMide postMerge()?

+0

Wszystkie zestawy zmian zwrócone przez wszystkie przesłonięcia (postMerge, postUpdate, preUpdateWithChanges, preUpdate) są puste :( – Martin

Powiązane problemy