一尘不染

手动更新hibernate版本

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的版本(我知道这很奇怪,不建议这样做)。
它工作得很好..但是我担心并发中的一些极端情况可能会失败或出现意外行为。
为此目的对版本进行这种调整是否安全?还是有其他更好的选择(我是


阅读 392

收藏
2020-06-20

共1个答案

一尘不染

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

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

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

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

2020-06-20