我有两个类,例如,使用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列
@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可被使用。
EntityManager
LockModeType