【问题标题】:EclipseLink Audit / History / Track changesEclipseLink 审计/历史/跟踪更改
【发布时间】:2013-03-17 10:33:18
【问题描述】:

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

我不简单地使用 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>

任何帮助将不胜感激。

【问题讨论】:

    标签: jpa eclipselink history audit changelog


    【解决方案1】:

    看起来更改集仅针对合并事件设置,而不是 postUpdate。请记录错误以将更改集添加到更新前/更新后事件。

    也可以从查询或对象中获取ChangeSet,

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

    或者,

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

    【讨论】:

    • 感谢您的回答。从查询中获取 ChangeSet 可以在 postUpdate if (event.getQuery() != null) 中工作。但是为什么event.getChangeSet() 为空。如果你能告诉我你的来源,那就太好了,这样我就可以阅读更多关于它的信息。我还阅读了有关此的其他帖子,但没有人发布他的解决方案或提示您可以阅读更多相关信息。
    猜你喜欢
    • 2015-09-08
    • 2013-03-18
    • 1970-01-01
    • 2010-09-06
    • 2011-02-01
    • 2016-08-25
    • 2014-12-08
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多