5

データの変更を追跡し、アプリケーションの履歴ログを作成する方法を実装しようとしました。私はEclipseLinkを使用しているので、EclipseLink FAQに書かれているように、変更を簡単かつ可能に取得できるはずです 。最初のソリューションは機能しますが、2番目のイベントベースは機能しません。イベントが発生するたびに、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>

どんな助けでも大歓迎です。

4

1 に答える 1

2

変更セットは、postUpdateではなく、マージイベントに対してのみ設定されているようです。バグをログに記録して、変更セットをpre/postUpdateイベントに追加してください。

クエリまたはオブジェクトからChangeSetを取得することもできます。

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

また、

((AttributeChangeListener)((ChangeTracker)event.getObject())._persistence_getPropertyChangeListener()).getObjectChangeSet()
于 2013-03-27T14:16:15.560 に答える