3

Enterprise Javaアプリケーションに、エンティティリスナーがアタッチされたエンティティクラスがあります。

@Entity
@EntityListeners(ChangeListener.class)
public class MyEntity {

   @Id
   private long id;

   private String name;

   private Integer result;

   private Boolean dirty;

   ...
}

ただし、ブール値を除くすべてのフィールドでエンティティリスナーがトリガーされるようにしたいと思います。フィールドを一時的にせずにエンティティリスナーをトリガーすることからフィールドを除外する方法はありますか?

HibernateでJavaEE5を使用しています。

4

2 に答える 2

3

ただし、独自のソリューションを実装すれば可能です。監査ログのビジネス要件についても同じ必要性があったため、独自のAuditFieldアノテーションを設計し、監査ログに記録するフィールドに適用しました。

これが1つのエンティティBeanの例です-サイト。

@AuditField(exclude={EntityActionType.DELETE})
@Column(name = "site_code", nullable = false)
private String siteCode;

したがって、この例は、「siteCode」がDELETEアクションを除いてログを監査するフィールドであることを示しています。(EntityActionTypeは列挙型であり、CRUD操作が含まれています。)

また、EntityListenerにはコードのこの部分があります。

@PostPersist
public void created(Site pEntity) {
log(pEntity, EntityActionType.CREATE);
}

@PreUpdate
public void updated(Site pEntity) {
log(pEntity, EntityActionType.UPDATE);
}

@PreRemove
public void deleted(Site pEntity) {
log(pEntity, EntityActionType.DELETE);
}

ここで、log()で行う必要があるのは、ログを監査するフィールドと、オプションで含まれるカスタムアクションを把握することです。

ただし、考慮すべきことがもう1つあります。別のエンティティ変数に注釈を付ける場合、エンティティのどのフィールドをログに記録する必要がありますか?(つまり、連鎖ロギング)

エンティティ内でのみ@AuditFieldで注釈を付けるか、その他の方法で注釈を付けるかは、あなたの選択です。私の場合、DBテーブルのPKであるエンティティIDのみをログに記録することにしました。しかし、ビジネスが変わる可能性があることを想定して、柔軟にしたいと思いました。したがって、すべてのエンティティは、基本エンティティクラスからのauditValue()メソッドを実装する必要があり、デフォルトの実装(オーバーライド可能)はそのIDを返すことです。

于 2012-10-22T15:57:33.267 に答える
2

ここにはある種の概念の混合があります。EntityListenersは、属性値の変更について通知されません。単一の属性についても、すべての属性についても通知されません。

そのため、ライフサイクルコールバックと呼ばれます。これらは、エンティティのライフサイクルイベントを追跡することによってトリガーされます。

  • 持続(前/後)
  • ロード(投稿)
  • 更新(前/後)
  • 削除(前/後)

それらのそれぞれについて、一致する注釈があります。したがって、答えは、永続属性のタイプによってこの機能を制限することはできないということです。

于 2012-07-18T07:40:06.937 に答える