メソッドを 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 がスローされるのはなぜですか?