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

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

4

3 に答える 3

66

値/関係をまったく監査したくない場合は、フィールドで NotAudited を使用します。OneToMany、ManyToMany、または単なる列などの関係の有無にかかわらず、フィールドでこれを使用できると思います。値を監査するが、関係の反対側のエンティティは監査しない場合は、関係フィールドで RelationTargetAuditMode.NOT_AUDITED を使用します。たとえば、ID/キー値を監査したいが、関連テーブルは監査したくないとします。

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

公式ドキュメントは、このトピック ( http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html ) についてあまり良くなく、NotAudited についてもまったく言及していません。

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

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

于 2016-07-08T15:10:10.233 に答える
43

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

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

于 2011-04-21T23:03:13.700 に答える
5

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

于 2018-06-27T07:43:08.670 に答える