Мой вопрос таков: Есть ли роль JPA merge
в веб-приложении без учета состояния?
В SO обсуждается операция merge
в JPA. Существует также отличная статья по этому вопросу, которая контрастирует слияние JPA с помощью более ручного процесса Do-It-Yourself (где вы находите объект через менеджер объектов и внесите изменения).
Мое приложение имеет богатую модель домена (проект, управляемый доменом ala), который использует аннотацию @Version
, чтобы использовать оптимистичную блокировку. Мы также создали DTO для отправки по проводам в рамках наших веб-сервисов RESTful. Создание этого слоя DTO также позволяет нам отправлять клиенту все, что ему нужно, и ничего не делает.
До сих пор я понимаю, что это довольно типичная архитектура. Мой вопрос о методах обслуживания, которым необходимо ОБНОВИТЬ (т.е. HTTP PUT) существующие объекты. В этом случае мы имеем следующие два подхода: 1) JPA Merge и 2) DIY.
Я не понимаю, как слияние JPA можно даже считать опцией для обработки обновлений. Здесь мое мышление, и мне интересно, есть ли что-то, чего я не понимаю:
1) Чтобы правильно создать отдельный объект JPA из проводного DTO, номер версии должен быть установлен правильно... else генерируется исключение OptimisticLockException. Но спецификация JPA говорит:
Сущность может получить доступ к состоянию своего поля версии или свойства или экспортируйте метод для использования приложением для доступа к версии, но не должны изменять значение версии [30]. Только поставщик постоянства разрешено устанавливать или обновлять значение атрибута версии в объект.
2) Слияние не обрабатывает двунаправленные отношения... поля обратной подсказки всегда заканчиваются как null.
3) Если какие-либо поля или данные отсутствуют в DTO (из-за частичного обновления), то слияние JPA удалит эти отношения или обнуляет эти поля. Hibernate может обрабатывать частичные обновления, но не слияние JPA. DIY может обрабатывать частичные обновления.
4). Первое, что будет использовать метод слияния, - это запросить базу данных для идентификатора объекта, так что для DIY не должно быть преимуществ по производительности.
5) В обновлении DYI мы загружаем объект и вносим изменения в соответствии с DTO - для этого нет вызова merge
или persist
, потому что контекст JPA реализует единицу, рабочий шаблон из коробки.
У меня есть это прямо?
Edit:
6) Поведение слияния в отношении ленивых загруженных отношений может отличаться среди поставщиков.