2011-01-05 8 views
4

Hibernate - Enversに問題があります。私は、0,1,2,3,4,5のいずれかの数字をとることができるstatusの属性を1つだけ持つドメインオブジェクトを持っています。値が変更された場合に限り、Hibernate - Envers - >属性の監査/バージョン化

@Entity 
public class Item { 
    ... 
    @Audited 
    private int status; 
    ... other variables, setter/getter, ... 
} 

EnversとHibernateのすべてが機能しています。新しいItemオブジェクトを作成し、それをデータベースに追加すると、行がItem_AUDデータベーステーブルに挿入されます。

しかし、私はそれを更新することに問題があります。 HibernateのDAO実装での私の更新は次のようになります。

Hibernate: update Item set amount=?, description=?, status=? where id=? 
Hibernate: insert into REVINFO (REVTSTMP) values (?) 
Hibernate: insert into Item_AUD (REVTYPE, status, id, REV) values (?, ?, ?, ?) 

しかし、問題は、私だけに行を挿入することを、次のとおりです。すべてのアップデートで

public void updateItem(Item i) { 
    SessionFactory sessionFac = HibernateUtility.getSessionFactory(); 
    Session s = sessionFac.getCurrentSession(); 
    Transaction trans = s.beginTransaction(); 
    s.update(i); 
    s.flush(); 
    trans.commit(); 
} 

、これは私のコンソールに印刷されていますステータス番号が変更された場合は、REVINFOItem_AUD

たとえば、項目のdescriptionを変更し、updateItemを呼び出して更新を実行してから、Enversは監査テーブルに新しいリビジョンを書き込みます。しかし、私はこの行動を望んでいません。

必要なもの:statusの値が変更された場合のみ、Enversはデータベースエントリを監査テーブルに書き込む必要があります。

しかし、どうすればいいですか?

最高のお付き合い

答えて

5

このためには、AuditEventListener &のメソッドをオーバーライドする必要があります。

public class EnversListener extends AuditEventListener { 

     @Override 
     public void onPostInsert(PostInsertEvent event) { 

     Object o = event.getEntity(); 

     if (o instanceof Item) { 

      Item currentItem = (Item) o; 
      Item previousItem = findItemById(currentItem.getId()); 

      if(previousItem != null) 
       if (currentItem.getStatus() != previousItem.getStatus()) 
       super.onPostInsert(event); 

     } else { 
      super.onPostInsert(event); 
     } 
     } 

     @Override 
     public void onPostDelete(PostDeleteEvent event) { 
     super.onPostDelete(event); 
     } 

     @Override 
     public void onPostRecreateCollection(PostCollectionRecreateEvent event) { 
     super.onPostRecreateCollection(event); 
     } 

     @Override 
     public void onPostUpdate(PostUpdateEvent event) { 
      super.onPostUpdate(event); 
     } 

     @Override 
     public void onPreRemoveCollection(PreCollectionRemoveEvent event) { 
     super.onPreRemoveCollection(event); 
     } 

     @Override 
     public void onPreUpdateCollection(PreCollectionUpdateEvent event) { 
     super.onPreUpdateCollection(event); 
     } 
} 

必要に応じて、他のオーバーライドされたメソッドにカスタム制約を追加できます。 hibernate.cfg.xml内のリスナークラスへのパスはそれに応じて設定する必要があります。

関連する問題