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。我意识到这一定会发生,因为我传递的用户对象只是从会话中获取的,因此它可能是陈旧的。在这种情况下,这在很大程度上是无关紧要的,因为只需要用户对象的 id 来保存 pollVote。

我的第一个问题是:在 cascade=CascadeType.MERGE 上:如果你传入一个带有 @Version 属性的陈旧对象,Hibernate 不应该从数据库中刷新对象而不是抛出一个 staleobjectstateexception 吗?

我的第二个问题是:为什么在只需要不可变的 id 时会抛出 StaleObjectStateException ?

4

1 回答 1

2

您正在合并 PollVote 并已将 Hibernate 配置为将合并级联到 PollVote 的用户。因此,hibernate 检查它正在合并的用户的状态在此期间没有被其他一些事务修改。这就是优化锁定的全部意义所在。

似乎您实际上不想在合并 PollVote 时合并用户的状态。在这种情况下,删除 cascade=MERGE 属性,并简单地使用EntityManager.getReference()来获取对您希望 PollVote 附加到的用户的引用。

于 2013-07-31T20:16:27.453 回答