Spring MVC @SessionAttributes путаница! - PullRequest
3 голосов
/ 06 мая 2009

Я использую 2.5 и делаю все с помощью аннотаций.

У меня есть простая форма, которая позволяет пользователю редактировать объект. Контроллер позади него создает объект и добавляет его в модель в GET и обрабатывает изменения в POST (submit). Работает нормально, но я не понимаю почему. Объект никогда не добавляется в сеанс явным образом, и «идентификатор» объекта не передается в метод submit. Как метод submit контроллера узнает значение «id» объекта?

Причина, по которой возник этот вопрос, заключается в том, что у меня есть другая форма / контроллер, которая почти идентична приведенной выше, но не работает, если я не добавлю объект в @SessionAttributes. Разница в том, что объект, с которым работает данный контроллер, имеет ссылку на другой объект, который загружается с отложенной загрузкой (я использую Hibernate за кулисами). Когда я отправляю форму, не помещая родительский объект в SessionAttributes, я получаю исключение DataIntegrityViolationException, поскольку я никогда не загружаю указанный объект.

Когда я добавляю родительский объект в @SessionAttributes, проблема волшебным образом исчезает. Я говорю волшебно, потому что, хотя я помещаю родительский объект в сеанс на GET, я все равно никогда явно не загружаю ссылочный объект, поэтому он должен быть нулевым (или пустой прокси-сервер или что-то еще).

Что в мире происходит? Мне нужна помощь!

Ответы [ 2 ]

2 голосов
/ 08 марта 2010

Объект, скорее всего, воссоздан на этапе отправки. Идентификатор может быть «сохранен» в скрытом поле формы.

Вы должны быть осторожны с атрибутами сеанса, я всегда стараюсь избегать этого, если у меня нет очень веских причин. В сочетании с Hibernate он может создавать все виды головной боли.

Если необходимо, используйте полностью инициализированную копию.

1 голос
/ 06 марта 2010

Как метод submit контроллера узнает значение "id" объекта?

Контроллер не знает «id». Я думаю, что Spring создает новый объект с помощью конструктора по умолчанию и заполняет данные формы в него. Hibernate должен думать, что это новый объект и сохраняет его в базе данных с новым идентификатором.

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