Обновление версии гибернации вручную

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

7
задан Premraj 14 March 2011 в 13:48
поделиться