28

Hibernate Envers を使用してエンティティを監査しています。

Fooプロパティとしてを持つ監査済みエンティティ が 1 つありList<Bar>ます。Barただし、エンティティを監査したくありません。したがって、私は次のように書きました。

@Entity
@Audited
public class Foo {

    @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID"))
    @ManyToMany(cascade = PERSIST)
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    public List<Bar> getBars() {
        return bars;
    }

}

今、私はのリビジョンを取得したいFoo:

    AuditReader reader = AuditReaderFactory.get(getEntityManager());
    Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult();

残念ながら、すべてのデータを取得したい場合 (つまり、 を遅延ロードする場合)、クエリを実行しようとしたときbarsにエラーが発生します。ORA-00942: table or view does not exist

select ... from T_FOO_BAR_AUD x, T_BAR y where ...

を使用する@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)と、Hibernate Envers は現在のエンティティのBarアイテムとのリンクを保持すると思いました。

T_BARでは、テーブルとT_FOO_BAR(結合テーブル)を明示的に監査することなく、どうすれば問題を解決できますか? つまり、barsリビジョン エンティティからのリストを取得すると、現在のエンティティから のリストが取得されます (とbarsの間のリンクは監査されないため)。FooBar

ありがとう。

4

1 に答える 1

35

あなたのケース@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)で使用すべきときに使用しているようです。@NotAudited

RelationTargetAuditMode.NOT_AUDITED単に対象エンティティを監査しません。List<Bar>のプロパティFoo、つまり結合テーブルを引き続き監査しようとします。

ドキュメントから:

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

于 2012-07-12T13:38:25.060 に答える