手动更新hibernate版本

时间:2011-03-14 13:48:19

标签: 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
}

请注意 - Bar和Qux没有@Version

如果我们更新Bar,那么hibernate将不会增加Foo的版本,并且对于Qux也是如此。但是我们的业务逻辑需求 - 如果有人在Foo中更新Bar并且其他线程正在尝试更新相同Foo的Qux但没有更新Bar,反之亦然,则此类更新应该失败。
如果我们更新Bar,hibernate不会更新Foo的版本属性,我们决定手动更新Foo的版本(我知道这很奇怪,不推荐)如果我们更新Bar和Qux。
它工作得很好..但是我担心并发中的一些极端情况可能会失败或者会出现意外行为。
为此目的,为版本进行这种调整是否安全?或者还有其他更好的选择(我已经尝试过乐观/悲观的力量增加)

1 个答案:

答案 0 :(得分:10)

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

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

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

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