Pre*_*raj 7 java hibernate jpa-2.0
我有两个类,说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
}
Run Code Online (Sandbox Code Playgroud)
请注意 - Bar和Qux没有@Version列
如果我们更新Bar,那么hibernate将不会增加Foo的版本和Qux的相同版本.但是我们的业务逻辑需要 - 如果有人在Foo中更新Bar并且其他线程正在尝试更新相同Foo的Qux但没有更新Bar,反之亦然,那么此类更新应该失败.
如果我们更新Bar,hibernate不会更新Foo的version属性,我们决定手动更新Foo的版本(我知道这很奇怪,不推荐),如果我们更新Bar和Qux.
它工作得非常好..但是我担心并发中的一些极端情况可能会失败或者会出现意外行为.
为此目的,为版本进行这种调整是否安全?或者还有其他更好的替代方案(我已经尝试过乐观/悲观的力量增量)
axt*_*avt 10
强制版本更新的正确方法如下:
em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
Run Code Online (Sandbox Code Playgroud)
它旨在用于这种情况.
其他的方法EntityManager是采取LockModeType可被使用.
| 归档时间: |
|
| 查看次数: |
3759 次 |
| 最近记录: |