Envers @ManyToManyサブクエリ

私は監査されたエンティティを持っていますA.エンティティAはフィールド '名前'とエンティティBの集合(多対多の関係として注釈)を保持します。私はAのインスタンス、定義された名前、エンティティBのコレクションを作成し、DBにすべて保存します。これはリビジョン#1です。それから、Aの名前を変更してDBで更新しました。これはリビジョン#2です。 次のメソッドを使用して、リビジョン#2のクラスAのすべてのエンティティを取得します

List list = getAuditReader().createQuery().forEntitiesAtRevision(A.class, 2)
    .add(AuditEntity.revisionNumber().eq((int) revisionId)).getResultList();

エンティティAはリビジョン#2で取得されますが、Enversはリビジョン#1からこのAに関連するエンティティBのコレクションも取得します。 Enversで使用されるクエリの例を次に示します。

SELECT a_b_aud.a_id, a_b_aud.b_id
FROM   a_b_aud CROSS JOIN b_aud
WHERE  a_b_aud.b_id=b_aud.id 
       AND b_aud.rev=(SELECT max(b_aud2.rev)) FROM b_aud AS b_aud2 WHERE b_aud2.rev<=2 AND b_aud.id=b_aud2.id)
       AND a_b_aud.rev=(SELECT max(a_b_aud2.rev)) FROM a_b_aud AS a_b_aud2 WHERE a_b_aud2.rev<=2 AND a_b_aud.a_id=a_b_aud2.a_id AND a_b_aud.b_id=a_b_aud2.b_id)

しかし、実際には、(パフォーマンスの問題のために)リビジョン#2の変更がない場合、エンティティBのコレクションとしてNULLが必要です。

このクエリには2つの副選択があります。また、A(C、D、E、F)に関連するエンティティのコレクションが複数存在し、各b_audおよびa_b_audに約100,000行ある場合、上記のクエリには多くの時間がかかります。 私はエンティティBを監査されていない(つまり、@ AudedアノテーションをBに追加しなかった)と定義し、次のようにA B関係を定義しました。

@ManyToMany
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name = "a_b", joinColumns = @JoinColumn(name = a_id))
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
public Set getBs();

それは最初のSUBSELECTを修正します。 しかし、私は要求されたリビジョン(私の場合#2)に対して存在しない場合、Bを照会しない標準的な解決策を見つけることができません。したがって、クエリは次のようになります。

SELECT a_b_aud.a_id, a_b_aud.b_id
FROM   a_b_aud CROSS JOIN b_aud
WHERE  a_b_aud.b_id=b_aud.id b_aud.rev=2 AND a_b_aud.rev=2

私が見つけた唯一の解決策は、ネイティブのSQLクエリを使用して、それを実行するために、ハイバネートテンプレートを使用しています。 ResultTransformerを使用して結果値をエンティティAに変換します。

誰でもこの問題を助けてくれますか? 2番目のSUBSELECTを避けるために追加する必要がある標準の設定/注釈はありますか?

0

1 答え

Enversには、要求されたときに関連エンティティをロードしないようにするオプションはありません。しかし、Bエンティティは(関係のアノテーションに関係なく)遅延ロードされているため、ロードするクエリを実行したくない場合は、単にそのフィールドにアクセスしないでください。

読み取りパフォーマンスを向上させるためには、有効性の監査戦略を検討することもできます。 http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#d5e4085 をご覧ください。読み込み速度は速くなりますが、書き込み速度は遅くなります。

0
追加された