Будет ли Hibernate увеличивать версию, если я добавлю / удалим / обновлю элемент надежной коллекции? - PullRequest
0 голосов
/ 14 октября 2019

Я изучаю механизм оптимистической блокировки hibernate и не нашел ответа на свой вопрос в руководстве пользователя

Допустим, у нас есть такая сущность:

@Entity
class Employee{
    @Version
    Long versionField;

    List<Employee> subordinates;
    ...

}

И где-то у нас есть следующий код:

Employee sub = ....
Emplyee emp = readEmploye();
emp.getSubordinates().add(sub);

Можно ли в этом случае контролировать приращение версии?

1 Ответ

1 голос
/ 14 октября 2019

По умолчанию нет. Поскольку вы не изменяете сущность, а скорее другие сущности, которые связаны с ней.

Однако такая функциональность возможна, но для этого требуется немало конфигурации и желательно планирование заранее. Я не собираюсь дублировать весь код от уважаемого Влада Михалча, см. Здесь .

В основном вам нужно использовать прослушиватели событий для перехвата вызовов сохранения и использования RootAwareинтерфейс (не интерфейс Hibernate, просто помощник) сохраняемая дочерняя сущность знает свой «корень» и может использовать блокировку OPTIMISTIC_FORCE_INCREMENT на своей родительской сущности для увеличения своей версии.


В отношении согласованности данных: сброс может произойти сбой, если дочерний элемент был изменен или родительский элемент был изменен (или оба были изменены), но lock() на корневом объекте гарантирует, что операция является атомарной. Если (пессимистическая) блокировка на корне успешна, и (оптимистическая) блокировка на дочернем элементе успешна, полная транзакция успешна. Благодаря пессимистичной блокировке, нет шансов получить «половину обновлений», которые бы повредили данные.

...