0

メソッドを cascade=CascadeType.MERGE でマークすると、切り離されたエンティティが再接続され、データベースへのラウンドトリップが発生する可能性があることを常に理解していました

public class PollVote{
@ManyToOne(cascade=CascadeType.MERGE,fetch=FetchType.LAZY,optional=true)
@JoinColumn(name="FK_UserId",nullable=true,updatable=false)
public User getUser() {
    return user;
}

この場合、User クラスには @Version プロパティがあります。

public class User{
@Column
@Version
@JsonIgnore
public Date getLastUpdate() {
    return lastUpdate;
}

ただし、場合によっては、StaleObjectStateException が発生します。私が渡しているユーザーオブジェクトはセッションから取得したばかりで、古い可能性があるため、これが発生しているに違いないことを認識しています。pollVote を保存するために必要なのはユーザー オブジェクトの ID だけであるため、この場合はほとんど関係ありません。

私の最初の質問は: cascade=CascadeType.MERGE について: @Version 属性を持つ古いオブジェクトを渡す場合、Hibernate は古いオブジェクト状態例外をスローする代わりに、データベースからオブジェクトを更新すべきではありませんか?

2 番目の質問は、不変の ID だけが必要な場合に StaleObjectStateException がスローされるのはなぜですか?

4

1 に答える 1

2

PollVote をマージしていて、PollVote のユーザーにマージをカスケードするように Hibernate を構成しました。したがって、休止状態は、マージしているユーザーの状態がその間に他のトランザクションによって変更されていないことを確認します。それが楽観的ロックの要点です。

PollVote をマージするときに、実際には User の状態をマージしたくないようです。その場合、cascade=MERGE 属性を削除しEntityManager.getReference()、PollVote を関連付けるユーザーへの参照を取得するために使用します。

于 2013-07-31T20:16:27.453 に答える