我一直明白,用 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。我意识到这一定会发生,因为我传递的用户对象只是从会话中获取的,因此它可能是陈旧的。在这种情况下,这在很大程度上是无关紧要的,因为只需要用户对象的 id 来保存 pollVote。
我的第一个问题是:在 cascade=CascadeType.MERGE 上:如果你传入一个带有 @Version 属性的陈旧对象,Hibernate 不应该从数据库中刷新对象而不是抛出一个 staleobjectstateexception 吗?
我的第二个问题是:为什么在只需要不可变的 id 时会抛出 StaleObjectStateException ?