我有两个类,说Foo和Bar映射为@OneToOne(双向),使用Hibernate(3.6.1 final)和JPA(2.0),如 -
@Entity
public class Foo{
@Id
private Long id;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "foo")
private Bar bar;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "foo")
private Qux qux;
@Version
private int version;
// getters and setters omitted
}
@Entity
public class Bar{
@Id
private Long id;
@OneToOne
@JoinColumn(name = "foo_id", nullable = false)
private Foo foo;
// getters and setters omitted
}
@Entity
public class Qux {
@Id
private Long id;
@OneToOne
@JoinColumn(name = "foo_id", nullable = false)
private Foo foo;
// getters and setters omitted
}
请注意 - Bar和Qux没有@Version
列
如果我们更新Bar,那么hibernate将不会增加Foo的版本,并且对于Qux也是如此。但是我们的业务逻辑需求 - 如果有人在Foo中更新Bar并且其他线程正在尝试更新相同Foo的Qux但没有更新Bar,反之亦然,则此类更新应该失败。
如果我们更新Bar,hibernate不会更新Foo的版本属性,我们决定手动更新Foo的版本(我知道这很奇怪,不推荐)如果我们更新Bar和Qux。
它工作得很好..但是我担心并发中的一些极端情况可能会失败或者会出现意外行为。
为此目的,为版本进行这种调整是否安全?或者还有其他更好的选择(我已经尝试过乐观/悲观的力量增加)
答案 0 :(得分:10)
强制版本更新的正确方法如下:
em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
它打算在这种情况下使用。
EntityManager
采用LockModeType
的其他方法也可以使用。