Я использую Spring 4 и Hibernate 4. У меня проблема, которая кажется у многих других людей. Я хочу, чтобы моя форма Spring редактировала только определенные свойства объекта, а не все.
По умолчанию, если я загружаю постоянный объект, отображаю некоторые его свойства в форме для редактирования, отправляю его на контроллер и сохраняю его... любые значения свойств, которые не были включены в форму, теряются. Я понимаю, почему это происходит, и я знаю несколько решений, плавающих вокруг.
1) В режиме экономии времени загрузите объект из базы данных, скопируйте только те свойства, которые вы хотите от модели, сохраните.
2) Когда начинается форма, загрузите объект и используйте функцию @SessionAttributes, чтобы сохранить его в сеансе между запросами.
Но мне не нравится ни одно из них. Может быть, я что-то пропустил, но решение кажется довольно простым. Где-то связующее свойство Spring Spring по умолчанию создает экземпляр объекта для копирования свойств формы. Если бы я мог просто переопределить это и использовать идентификатор для загрузки сохраненного объекта из БД, тогда привязка Spring использует это как целевой объект (копирование только свойств, представленных с формой, оставив остальных нетронутыми)... тогда я думаю, что решит мою проблему.
Я искал, как/где я могу использовать собственный класс WebDataBinder. Я не понимаю, как... и я даже не уверен, что это место мне нужно искать.
Какие-либо предложения?
Благодарю!!
РЕДАКТИРОВАТЬ:
Я приведу гипотетический пример, чтобы лучше объяснить мою проблему. Скажем, у меня есть класс сущностей, Customer, который имеет 50 свойств. У меня есть форма для обновления контактной информации. Это всего лишь 5 свойств из 50.
улица
город
государство
застежка-молния
Телефон
Если я делаю это в форме Spring, когда форма отправляется для сохранения, Spring создает новый "пустой" объект, заполняет его значениями из формы и передает их моему контроллеру... это то, что сохраняется. Проблема в том, что другие свойства, такие как firstName, lastName, customerType и т.д., Не были включены в форму, Spring оставляет их в покое, и они остаются пустыми. Когда я говорю Hibernate, чтобы обновить объект, используя этот, предоставленный Spring, Hibernate полагает, что я хочу, чтобы firstName, lastName и т.д. Были нулевыми, поскольку это значения, которые я предоставляю в bean-компоненте. Он не знает, что я только изменил некоторые из них.
Так что же происходит? 45 из моих 50 ценностей собственности сбрасываются.
В комментариях ниже Sp00m предложил решение, которое будет работать... включать все другие свойства в скрытые поля. Но по разным причинам это решение - огромная головная боль для меня.
Если бы я мог просто получить Spring, чтобы загрузить объект из базы данных (вместо создания нового/чистого объекта) И затем заполнить только те поля, которые были отправлены с формой. Я считаю, что это решило бы мою проблему.
Подобное обсуждение (но с помощью решения скрытого поля) можно найти здесь. Http://www.coderanch.com/t/529490/Spring/Spring-MVC-Hibernate-Update-column
Итак, вот решение, которое работает для меня. Добавляя следующий метод с аннотацией в контроллере, Spring использует его для создания экземпляра объекта для привязки. Именно то, что мне нужно.
(Я уже пробовал это раньше, но я не указал имя атрибута модели в аннотации, что, очевидно, не очень хорошо).
Спасибо всем, кто прокомментировал предложения.
@ModelAttribute("entity")
public MyEntity getEntity(@RequestParam(required=false) Integer id)
{
if (id == null)
{
return myEntityManager.createEntity(entityClass);
}
else
{
return myEntityManager.find(entityClass, id);
}
}
<input type="hidden" />
тегами<input type="hidden" />
.