Я много читал и тестировал. Проблема возникла из-за моего неправильного понимания JPA / Hibernate. merge () всегда выполняет поиск в БД, а также планирует обновление для объекта. Я не нашел упоминаний об этом в спецификации JPA, но в книге «Java Persistence with Hibernate» об этом упоминается.
Если смотреть через API EntityManager (и Session в качестве запасного), то выглядит так, как будто нет средств просто назначить сущность текущему постоянному контексту БЕЗ планирования расписания обновления. В конце концов, я хочу перемещаться по графу объектов, изменяя свойства по мере необходимости и запускать обновление (с проверкой версии при необходимости) позже. Я думаю, что каждый Webapp, использующий ORM, должен это делать?
Базовый рабочий процесс, который я ищу:
- загрузить объект из БД (или создать новый)
- позволяют сущности (и все ее ассоциации становятся отсоединенными (когда EntitManager закрывается в конце HTTP-запроса)
- когда приходит следующий HTTP-запрос, снова поработайте с этими объектами, перемещаясь по дереву, не опасаясь LazyInitExceptions
- вызов метода, который сохраняет все изменения, сделанные в течение 1-3)
С фильтром OSIV из весны в сочетании с реализацией IModel из калитки я подумал, что я заархивировал это.
Я в основном вижу 2 возможных выхода из этого:
a) загрузить сущность и все ассоциации, необходимые при входе на определенную страницу (вариант использования), позволяя им отсоединиться, добавляя / изменяя их по мере необходимости в течение нескольких запросов http. Затем присоедините их, когда пользователь инициирует сохранение (валидаторы обеспечат правильное состояние), и отправьте их в базу данных.
b) использовать текущую настройку, но убедитесь, что для всех вновь добавленных объектов установлены все необходимые поля (возможно, с использованием некоторых компонентов мастера). у меня все еще будут все обновления базы данных для каждого слияния (), но, надеюсь, администратор базы данных не поймет;)
Как другие люди работают с JPA в веб-среде? Любые другие варианты для меня?