2016-02-22 7 views
10

मैं अपने जेपीए इकाइयों (एक लॉग फ़ाइल में, डेटाबेस नहीं) में एक परिवर्तन ट्रैकर शामिल करने का प्रयास कर रहा हूं, हालांकि मेरे DescriptorEventAdapter द्वारा किए गए परिवर्तनसेट हमेशा शून्य है। मैं एक्लिप्ससेंक 2.5.2, ओजेडीबीसी 6, वसंत-ओआरएम 4.1.1 का उपयोग कर रहा हूं।जेपीए DescriptorEventAdapter चेंजसेट हमेशा शून्य

सभी घटनाओं को कहा जाता है (preUpdateWithChanges सहित) और परिवर्तन डेटाबेस में धकेल दिए जाते हैं। मैं इकाई अद्यतन करने के लिए entityManager.merge (इकाई) का उपयोग कर रहा हूँ।

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

कुछ इकाई

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

eclipse wiki से UnitOfWork का उपयोग करना भी एक अशक्त ObjectChangeSet देता है।

+0

क्या यह काम करता है जैसा कि आप कैश एनोटेशन को हटाते हैं तो आप उम्मीद करेंगे? – Chris

+0

नहीं, वही परिणाम। कोई चेंजसेट – Martin

+1

चेंजसेट के अलावा, बाकी वर्णनकर्ता आवेदक अपेक्षित के रूप में आबादी है? –

उत्तर

3

event.getQuery() काम पढ़ रहा है। कोई विचार नहीं क्यों event.getChangeSet() emtpy है हालांकि इस तरह मैंने इसे हल किया।

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

DescriptorEventAdapter.preUpdate के लिए API दस्तावेज़ से:

इस घटना वस्तु की परिवर्तन गणना से पहले उठाया है ....

(बोल्ड मेरा है।)

DescriptorEvent.changeSet के लिए प्रलेखन से:

पोस्ट विलय ईवेंट के लिए यह संभव है कि एक परिवर्तन सेट उत्पन्न हुआ हो।

आपके पोस्टमेज() ओवरराइड में क्या होता है?

+0

सभी ओवरराइड द्वारा पोस्ट किए गए सभी परिवर्तन (पोस्टमेज, पोस्टअपडेट, प्रीअपडेट WithChanges, preUpdate) शून्य हैं :( – Martin

संबंधित मुद्दे