#java #hibernate
#java #спящий режим
Вопрос:
Возможно, я неправильно понял семантику get и merge в режиме гибернации, но если я это сделаю (в контроллере метода Spring, поэтому с использованием уровней service и dao):
ClassMy a = service.get(234, ClassMy.class) (this loads the object using session.get)
a.setPropertyX("test");
это не приведет к автоматическому обновлению. Вместо этого, если бы у меня уже был «a» в памяти, я бы сделал:
a = (ClassMy) service.merge(a);
a.setPropertyX("test");
это приводит к обновлению.
Должен ли я объединить объект после его загрузки с помощью get? Звучит так странно…
Комментарии:
1. Глупый я, единственная ошибка заключалась в том, что для propertyX уже было установлено значение «test». В этой ситуации hibernate ничего не сделает. Установка значения «test2» после загрузки и фиксации приведет к обновлению.
Ответ №1:
У вас что-то не так.
Первый фрагмент должен работать при условии, что он выполняется в той же транзакции, service.get
что и вызов (т. Е. транзакция должна быть запущена методом, содержащим этот фрагмент, а не service.get
методом).
Во втором фрагменте, если он выполняется в транзакции, он должен работать: он загружает объект из сеанса, затем копирует состояние отсоединенного объекта a в присоединенный объект, затем изменяет свойство присоединенного объекта. Если он не запускается в транзакции (т. Е. Если Это service.merge, который запускает транзакцию), слияние сработает, но изменение свойства будет выполнено для отдельного объекта, и новое значение свойства сохраняться не будет.
Ответ №2:
Вы должны убедиться, что транзакция существует. Запуск транзакции, вызов «Сохранить», а затем фиксация транзакции является обязательной.