Поддерживает ли Spring Data REST JPA @Version?

Могу ли я использовать JPA @Version с Spring Data REST?

В Spring Data REST 1.1.0.M1 я могу настроить экспортер репо для предоставления идентификатора объекта, который, как это бывает, также предоставляет поля с аннотациями @Version. Поэтому я подумал, что если я попытаюсь PUT использовать какой-либо старый номер версии, я получу OptimisticLockException. Но этого не происходит. Вместо этого PUT выполняется успешно (включая обновления данных), за исключением того, что номер версии всегда строго увеличивается, а не является той старой версией, которую я установил.

Я прочитал здесь, что я не должен сам устанавливать номер версии, поскольку поведение неопределенный. В этом есть смысл. Но кажется, что это делает @Version бесполезным в тех случаях, когда все, что у меня есть, - это JSON-представление сущности вместо ссылки на сущность: с JSON-представлением мне нужно было бы отправить номер версии обратно в службу, что в конечном итоге вызовите setVersion(), что, в свою очередь, приведет к неопределенному поведению.

Правильно ли я понимаю ситуацию? Могу ли я использовать @Version с Spring Data REST?

ОБНОВЛЕНИЕ. Учитывая ответ Мартена, я в конечном итоге использовал события JPA для достижения оптимистичной возможности блокировки. Я написал здесь подход:

http://springinpractice.com/2013/09/14/optimistic-locking-with-spring-data-rest/


person Community    schedule 13.09.2013    source источник
comment
ссылка не работает (   -  person Maksym Pecheniuk    schedule 01.08.2018


Ответы (1)


Я бы сказал нет, и это не имеет особого отношения к использованию Spring Data REST. Вы уже упоминали, что не можете установить версию самостоятельно, так как то, что происходит, не определено (у меня тоже был этот приятный опыт). У вас в основном такая же проблема, когда вы публикуете данные обычной формы и не сохраняете текущую версию в сеансе (@SessionAttributes).

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

person M. Deinum    schedule 13.09.2013
comment
Спасибо, Мартен. Я сделал нечто подобное, используя механизм событий SDR (в основном проверяю конфликты перед сохранением), но я думаю, что было бы лучше вернуть это ближе к базе данных так, как вы предлагаете. - person ; 13.09.2013
comment
Я предлагаю вам создать запрос на улучшение в jira springsource, возможно, они могут добавить что-то нестандартное (или настраиваемое). Я вижу, что это обычный вариант использования. - person M. Deinum; 14.09.2013