Обновление спящей версии вручную - PullRequest
7 голосов
/ 14 марта 2011

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

1 Ответ

10 голосов
/ 14 марта 2011

Правильный способ принудительного обновления версии следующий:

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

Он предназначен для использования в таких случаях.

Можно использовать и другие методы EntityManager, которые принимают LockModeType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...