2013-03-27 189 views
3

我试图实现一种方法来跟踪数据更改并为我的应用程序创建历史日志。因为我使用的是EclipseLink,所以应该很容易并且可以像他们那样获得更改write on the EclipseLink FAQ 第一个解决方案有效,但第二个基于事件的方法不起作用。每次事件发生时,ObjectChangeSet都为null。EclipseLink审计/历史/跟踪更改

为什么我不能简单地使用HistoryPolicy的原因是,我wan't存储有关登录的用户(而不是数据库用户)信息和改变的数据到一个单独的表。我查了很多,但找不到解决这个问题的办法。

这是我的实体类:

@Entity 
@EntityListeners(HistoryEventListener.class) 
@Table(name = "t_users") 
    public class Users implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GENSEQ_USERS") 
@SequenceGenerator(name = "GENSEQ_USERS", sequenceName = "SEQ_USERS", allocationSize = 1, initialValue = 1) 
private Integer id; 
@Column(nullable = false) 
private String userid; 
... 
} 

这是我DescriptorEventAdapter类:

public class HistoryEventListener extends DescriptorEventAdapter { 

@Override 
public void postUpdate(DescriptorEvent event) { 
    ObjectChangeSet changeSet = event.getChangeSet(); 
    if (changeSet != null) { 
     System.out.println("ObjectChangeSet not null"); 
    } 
    System.out.println("ObjectChangeSet null"); 
} 

@Override 
public void postMerge(DescriptorEvent event) { 
    ObjectChangeSet changeSet = event.getChangeSet(); 
    if (changeSet != null) { 
     System.out.println("ObjectChangeSet not null"); 
    } 
    System.out.println("ObjectChangeSet null"); 
} 
} 

我已经使用的persistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
<persistence-unit name="PhoneBookPU" transaction-type="RESOURCE_LOCAL"> 
    <provider> 
     org.eclipse.persistence.jpa.PersistenceProvider 
    </provider> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@somehostname:1521:xyz"/> 
     <property name="javax.persistence.jdbc.password" value="getyourown"/> 
     <property name="javax.persistence.jdbc.user" value="username"/> 
     <property name="javax.persistence.logging.level" value="INFO"/> 
    </properties> 
</persistence-unit> 
</persistence> 

任何帮助将不胜感激。

回答

1

看起来像变更集只是为合并事件设置,而不是postUpdate。请记录一个错误,将更改集添加到pre/postUpdate事件中。

您也可以从查询或对象得到变更,

((UpdateObjectQuery)event.getQuery()).getObjectChangeSet() 

,或者

((AttributeChangeListener)((ChangeTracker)event.getObject())._persistence_getPropertyChangeListener()).getObjectChangeSet() 
+0

谢谢您的回答。从查询中获取ChangeSet可在postUpdate'if(event.getQuery()!= null)'中使用。但为什么'event.getChangeSet()'为空。如果你能告诉我你的消息来源,那就太好了,所以我可以详细阅读它。我也阅读了其他文章,但没有人发布他的解决方案或提示,你可以阅读更多关于它的信息。 –