手动更新hibernate版本

我有两个类,例如,使用Hibernate(3.6.1最终版)和JPA(2.0)将Foo和Bar映射为@OneToOne(双向),例如-

@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的version属性,因此,如果我们更新Bar和Qux,我们决定手动更新Foo的版本(我知道这很奇怪,不建议这样做)。

它工作得很好..但是我担心并发中的一些极端情况可能会失败或出现意外行为。

为此目的对版本进行这种调整是否安全?还是有其他更好的选择(我是

回答:

强制版本更新的正确方法如下:

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

它打算在这种情况下使用。

其他的方法EntityManager是采取LockModeType可被使用。

以上是 手动更新hibernate版本 的全部内容, 来源链接: utcz.com/qa/401702.html

回到顶部