web-dev-qa-db-ja.com

Hibernate Enversを使用して結合テーブルと関連エンティティを監査しない方法は?

私はHibernateEnversを使用してエンティティを監査しています。

プロパティとして_List<Bar>_を持つ1つの監査済みエンティティFooがあります。ただし、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はcurrentエンティティのBarアイテムとのリンクを保持します。

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

ありがとう。

23
Romain Linsolas

ケースで_@NotAudited_を使用する必要があるときに、@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)を使用しているようです。

_RelationTargetAuditMode.NOT_AUDITED_は単にターゲットエンティティを監査しません。それでも、Fooの_List<Bar>_プロパティ、つまり結合テーブルを監査しようとします。

ドキュメントから:

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

27
bvulaj