手动更新hibernate版本
我有两个类,例如,使用Hibernate(3.6.1最终版)和JPA(2.0)将Foo和Bar映射为@OneToOne(双向),例如-
@Entitypublic 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的version属性,因此,如果我们更新Bar和Qux,我们决定手动更新Foo的版本(我知道这很奇怪,不建议这样做)。
它工作得很好..但是我担心并发中的一些极端情况可能会失败或出现意外行为。
为此目的对版本进行这种调整是否安全?还是有其他更好的选择(我是
回答:
强制版本更新的正确方法如下:
em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
它打算在这种情况下使用。
其他的方法EntityManager
是采取LockModeType
可被使用。
以上是 手动更新hibernate版本 的全部内容, 来源链接: utcz.com/qa/401702.html