4

リンクテーブルに追加のプロパティがある多対多の関係があります。したがって、リンク テーブルもエンティティ クラスで表され、 と呼ばれCompositionます。の主キーComposition@Embeddable、対応するエンティティへのリンクです。2@ManyToOne参照。

ユーザーが 2 つの参照のいずれかを選択するときにエラーが発生する可能性があるため、複合主キーを更新する必要があります。ただし、JPA (休止状態) の仕組みにより、更新ではなく常に新しい行 (挿入) が作成され、古い行Compositionは引き続き存在します。最終的な結果は、更新される代わりに新しい行が追加されたことです。

オプション1:

新しいものを挿入する前に古いCompositionものを削除することもできますが、これを処理する適切なメソッドには古いバージョンと新しいバージョンの両方が必要です。さらに、更新されたバージョンは実際には新しいエンティティであるため、楽観的ロックは機能せず、最後の更新が常に優先されます。

オプション 2:

ネイティブ クエリ。また、クエリはバージョン列をインクリメントし、WHERE 句にバージョンを含めます。更新回数が 0 の場合にスローOptimisticLockException(同時変更または削除)

より良い選択は何ですか?この問題に対する「一般的なアプローチ」は何ですか?

4

1 に答える 1

2

の主キーをComposition自動生成される UID に変更しないのはなぜですか? その後、ユーザーは、エンティティを削除/再作成することなく、結合されるエンティティへの 2 つの参照を変更できますComposition。その後、楽観的ロックが維持されます。

編集:例:

@Entity
@Table(name = "COMPOSITION")
public class Composition {

    @Id
    @Column(name = "ID")
    private Long id;   // Auto-generate using preferred method

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn( .... as appropriate .... )
    private FirstEntity firstEntity;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn( .... as appropriate .... )
    private SecondEntity secondEntity;

....
于 2013-09-17T22:30:07.877 に答える