Как увеличить поле версии при сохранении в Hibernate независимо от того, грязный он или нет? - PullRequest
2 голосов
/ 13 мая 2011

Я использую Hibernate со столбцом версии для реализации оптимистического управления параллелизмом.

Вопрос: Можно ли увеличивать номер версии объекта каждый раз, когда я сохраняю его в базе данных, независимо от того,если оно было изменено или нет?

Пока в сущности изменяется какое-либо поле, номер версии увеличивается.Но если в сущности поле не изменилось, номер версии сущности не изменится.

Причина этого вопроса в том, что у меня есть логическое отношение «мастер-деталь» между двумя таблицами, и я хотел быувеличивать номер версии в основной таблице всякий раз, когда что-то меняется в деталях, даже если основные данные не менялись.Это отношение «мастер-деталь» не отображается в Hibernate.Я просто всегда сохраняю их вместе в одной транзакции.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Вы можете использовать перехватчики Hibernate для обновления номера версии основной записи, когда вы обнаружите, что деталь изменилась.

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/events.html

Одно ограничение заключается в том, что это решение относится только к Hibernate.JPA также допускает управляемую событиями логику с использованием аннотаций (например, PostPersist, PostUpdate и т. Д.), Но эти методы не дают вам доступа к базовому сеансу (и, что более важно, документация предостерегает вас от использования этих методов для изменения сеансаданные).Обычно я использовал перехватчики для выполнения аудита, но их можно легко расширить для обновления номера версии при изменении записи.

0 голосов
/ 13 мая 2011

Вы можете вызвать lock() (или использовать другие методы, которые принимают LockMode) с LockMode.OPTIMISTIC_FORCE_INCREMENT.

...