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

Может быть, я неправильно понял семантику get и merge в hibernate, но если я сделаю это (в контроллере метода Spring, поэтому использую слои service и dao):

ClassMy a = service.get(234, ClassMy.class) (this loads the object using session.get)

a.setPropertyX("test");

это не приведет к автоматическому обновлению. Вместо этого, если бы у меня уже было «а» в памяти, я бы сделал:

a = (ClassMy) service.merge(a);
a.setPropertyX("test");

это приводит к обновлению.

Нужно ли объединять объект после загрузки с помощью get? Звучит так странно ...

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Вы ошиблись.

Первый фрагмент должен работать при условии, что он выполняется в той же транзакции, что и вызов service.get (т. Е. Транзакция должна быть запущена методом, содержащим этот фрагмент, а неметод service.get).

Во втором фрагменте, если он выполняется в транзакции, он должен работать: он загружает объект из сеанса, а затем копирует состояние отсоединенного объекта a в присоединенный объект, затем изменяет свойство подключенного объекта.Если он не выполняется в транзакции (т.е. если это service.merge, который запускает транзакцию), слияние будет работать, но изменение свойства будет выполнено для отдельного объекта, и новое значение свойства выиграетне будет сохраняться.

0 голосов
/ 29 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...