java – 手动更新hibernate版本

我有两个类,说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的version属性,我们决定手动更新Foo的版本(我知道这很奇怪,不推荐),如果我们更新Bar和Qux.
它工作得非常好..但是我担心并发中的一些极端情况可能会失败或者会出现意外行为.
为此目的,为版本进行这种调整是否安全?或者还有其他更好的替代方案(我已经尝试过乐观/悲观的力量增量)

最佳答案
强制版本更新的正确方法如下:

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

它旨在用于这种情况.

也可以使用采用LockModeType的EntityManager的其他方法.

转载注明原文:java – 手动更新hibernate版本 - 代码日志