Почему загрузка объекта с помощью session.get не сохраняет изменения объекта в конце сеанса?

#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:

Вы должны убедиться, что транзакция существует. Запуск транзакции, вызов «Сохранить», а затем фиксация транзакции является обязательной.