2016-02-22 15 views
10

Tôi đang cố gắng bao gồm một trình theo dõi thay đổi cho các thực thể JPA của tôi (đối với tệp nhật ký, không phải là cơ sở dữ liệu), tuy nhiên bộ thay đổi được trả về bởi DescriptorEventAdapter của tôi luôn là rỗng. Tôi đang sử dụng EclipseLink 2.5.2, ojdbc6, spring-orm 4.1.1.JPA DescriptorEventAdapter ChangeSet luôn rỗng

Tất cả các sự kiện được gọi (bao gồm preUpdateWithChanges) và các thay đổi được đẩy vào cơ sở dữ liệu. Tôi đang sử dụng entityManager.merge (thực thể) để cập nhật thực thể.

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

Một số tổ chức

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

Sử dụng UnitOfWork từ eclipse wiki cũng trả về một Null ObjectChangeSet.

+0

Tính năng này có hoạt động như bạn mong đợi nếu bạn xóa chú thích Cache không? – Chris

+0

không, cùng một kết quả. Không có ChangeSet – Martin

+1

Ngoài ChangeSet, phần còn lại của DescriptorEvent có được như mong đợi không? –

Trả lời

3

Đọc event.getQuery() hoạt động. Không có ý tưởng tại sao event.getChangeSet() là emtpy tuy nhiên đây là cách tôi giải quyết nó.

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

Từ tài liệu API cho DescriptorEventAdapter.preUpdate:

Sự kiện này được nâng lên trước thay đổi của đối tượng được tính ....

(Các bolding là bổ sung của tôi.)

Từ tài liệu cho DescriptorEvent.changeSet:

Đối với bài đăng hợp nhất sự kiện, có thể đã có một tập hợp thay đổi được tạo.

Điều gì xảy ra trong ghi đè của bạn sau khi ghi đè()?

+0

Tất cả các thay đổi được trả về bởi tất cả ghi đè (postMerge, postUpdate, preUpdateWithChanges, preUpdate) là null :( – Martin

Các vấn đề liên quan