У меня есть два класса, скажем, Foo и Bar отображаются как @OneToOne (двунаправленный) с использованием Hibernate (финал 3.6.1) с 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.Но наша бизнес-логика нуждается в том, что если кто-то обновляет Bar в Foo, а другой поток пытается обновить Qux того же Foo, но не имеет обновленного Bar, и наоборот, такие обновления должны завершиться неудачей.
Поскольку hibernate необновите свойство версии Foo, если мы обновим Bar, мы решили обновить версию Foo вручную (я знаю, что это довольно странно и не рекомендуется), если мы обновим Bar и Qux.
Он работает отлично ... но ябеспокоюсь о некоторых крайних случаях параллелизма, которые могут привести к сбою или могут привести к непреднамеренному поведению.
Безопасно ли для этого использовать такую модификацию с версией?ИЛИ есть ли другая лучшая альтернатива этому (я уже пробовал увеличение оптимистической / пессимистической силы)