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