5

Hibernate-Enversに問題があります。0、1、2、3、4、5のいずれかになり得る監査済み属性が1つしかないドメインオブジェクトがありますstatus

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

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

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

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

更新のたびに、これは私のコンソールに出力されます。

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 (?, ?, ?, ?)

しかし、問題は、に行を挿入したいだけでREVINFOItem_AUDステータス番号が変更された場合です。

例:descriptionアイテムのを変更し、呼び出しを使用して更新を実行してupdateItemから、Enversが監査テーブルに新しいリビジョンを書き込みます。しかし、私はこの振る舞いを望んでいません。

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

しかし、どうすればこれを行うことができますか?

よろしく、ティム。

4

1 に答える 1

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内のリスナークラスへのパスは、それに応じて構成する必要があります。

于 2011-01-05T10:56:04.663 に答える