web-dev-qa-db-ja.com

Hibernate EnVersの@NotAuditedとRelationTargetAuditMode.NOT_AUDITEDの違いは何ですか?

@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

なぜ両方を使用するのですか?両方を使用するのは良いですか、それとも1つで十分ですか?

49
Phil

値/関係をまったく監査したくない場合は、フィールドでNotAuditedを使用します。 OneToMany、ManyToMany、または単なるColumnなどのリレーションシップの有無に関係なく、フィールドでこれを使用できると思います。値を監査し、関係の反対側のエンティティは監査しない場合は、関係フィールドでRelationTargetAuditMode.NOT_AUDITEDを使用します。たとえば、ID /キー値を監査し、関連テーブルは監査しないようにします。

また、RelationTargetAuditModeをクラス全体に適用することもできます。これは、クラス内のすべてのリレーションシップについて、相手側を監査しないと言っているだけです。このアノテーションを誤って使用して、下のエンティティを監査しないことを意味していたので、これは私を混乱させました。エンティティを監査したくない場合は、エンティティクラスに監査アノテーションを付けないでください。エンティティを参照する他の監査対象エンティティでは、関係フィールドにNotAuditedまたはRelationTargetAuditMode.NOT_AUDITEDを使用する必要があります。

公式のドキュメントはこのトピックについて素晴らしいものではありません( http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html ) NotAuditedに言及する。

過去のプロジェクトでは、非常に特定のテーブルセットを監査する必要があり、他のテーブルは監査しなかったため、これらのアノテーションを使用する必要がありました。一部の監査済みエンティティから、一部の未監査エンティティと外部キー関係があります。 RelationTargetAuditMode.NOT_AUDITEDアノテーションをよく使用して、少なくとも、リレーションシップの反対側のエンティティではなく、外部キー値/ IDを監査します。この注釈がない場合は、ENVERSが非監査エンティティの監査テーブルに監査レコードを挿入しようとするランタイム例外が発生し、そのテーブルは存在しません。 NotAuditedアノテーションは、監査する必要のないManyToMany結合テーブルの関係に使用します。監査対象のエンティティテーブル自体には何も記録されません(外部キーID /値はありません)。

そうそう-両方を使用すると何が起こるかはドキュメントに記載されていません(どちらが優先されるかはわかりません)が、特定のフィールドで両方を同時に使用することは意図していないと思います。どちらかを使用してください。

45
Ryan

ターゲットエンティティとその関係の監査は、2つの別個のものです。必要なものに依存します。 Hibernate Envers-Easy Entity Auditing ドキュメントから:

ターゲットエンティティが監査されないリレーションを監査する場合(たとえば、変更されず、監査される必要がない辞書のようなエンティティの場合)、@ Audited( targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)。次に、エンティティの履歴バージョンを読み取るとき、リレーションは常に「現在の」関連エンティティを指します。

38
WhiteFang34

@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)の使用法は1つだけです。監査されていないエンティティとの関係を所有するエンティティを監査し、監査されていないエンティティのIDに関する監査データの情報が必要な場合。 CustomerBookingが監査され、Hotelクラスが監査されないとします。ホテルフィールドには2つの選択肢があります:_@NotAudited_(この場合、履歴データにホテルに関する情報はまったくありません)または@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)この場合、常にホテルの最新の状態になります監査データ内。ホテルが監査された場合、_RelationTargetAuditMode.NOT_AUDITED_は無視されるだけです(ホテルの履歴データがあります)。 _@NotAudited_は、「履歴データのこのフィールドは気にしない」という意味です(保存されず、関係はnullになります。CustomerBookingに関する履歴データを見ると表示されません。 )

1