8

Hibernate を介して @OneToMany 関係から楽観的ロックを明示的に除外するのは、どのような状況で適切でしょうか?

私は Hibernate に関する投稿を読んでいますが、これは基本的に、子エンティティを更新すると親エンティティに楽観的ロックが発生することを示していますが、これは通常は不要です。ここでのキーワードは通常、次のとおりです...このような関係で楽観的ロックが必要な場合と必要でない場合をより正確に説明できる人はいますか?

オプティミスティック ロックの除外を示すコード例を次に示します。

// Bars - these are specifically excluded from optimist lock
// for the object, since we don't want to obtain optimistic
// lock when we add a new bar
@OptimisticLock(excluded = true)
@OneToMany
@JoinColumn(name = "FOO_ID", nullable = false, updatable = false)
private List<FooBar> bars = new LinkedList<FooBar>();
4

1 に答える 1

13

基本的に、親がその子を論理的に「所有」している場合、つまり、親と子が全体として一度に変更される場合、1 対多の関係には楽観的ロックが必要です。同じフォームでユーザーに提示される で構成される は、この種の関係の例ですOrderOrderLine

それ以外の場合、子を個別に変更する必要がある場合は、楽観的ロックから除外する必要があります。Topicwith Posts はこのケースの例です。

技術的に言えば、この質問は関係の方向性に関連しています。楽観的ロックの目的は、変更が失われるのを防ぐことです。そのため、変更が失われる可能性がある場合は、1 対多の関係に対して有効にする必要があります。これは、親がリレーションシップの所有側である場合、つまり、1 対多のリレーションシップが一方向である場合に発生します ( Order-などのリレーションシップをモデル化するのは自然な選択であることに注意してくださいOrderLine)。

双方向の一対多リレーションシップの場合、「多」側がリレーションシップの所有側であるため、「一」側でのリレーションシップの変更はデータベースに影響を与えないため、失われることはありません。

于 2011-06-14T19:00:33.517 に答える