我试图实现一种跟踪数据更改的方法,并为我的应用程序创建历史记录日志。因为我正在使用EclipseLink,所以应该可以轻松地获得类似write on the EclipseLink FAQ的更改 第一个解决方案有效但基于第二个事件不起作用。每次引发事件时,ObjectChangeSet都为null。
我不是简单地使用HistoryPolicy的原因是我不想将有关已登录用户(不是db用户)和已更改数据的信息存储到单独的表中。我搜索了很多,但找不到解决这个问题的方法。
这是我的实体类:
@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>
非常感谢任何帮助。
答案 0 :(得分:1)
看起来只为合并事件设置了更改集,而不是postUpdate。请记录一个错误,以便将更改集添加到pre / postUpdate事件中。
您还可以从查询或对象中获取ChangeSet,
((UpdateObjectQuery)event.getQuery()).getObjectChangeSet()
,或者
((AttributeChangeListener)((ChangeTracker)event.getObject())._persistence_getPropertyChangeListener()).getObjectChangeSet()