Как загрузить постоянную сущность Hibernate для привязки, чтобы не потерянные свойства формы?

1

Я использую 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

  • 0
    Другое простое решение - связать свойства <input type="hidden" /> тегами <input type="hidden" /> .
  • 0
    Спасибо за ваш ответ. Вы правы, но у меня есть много разных классов сущностей с множеством свойств. У меня есть разные формы, которые редактируют разные свойства в зависимости от условий. В моем случае это решение слишком утомительно и подвержено ошибкам.
Показать ещё 5 комментариев
Теги:
spring
spring-mvc
hibernate
spring-4

1 ответ

1
Лучший ответ

Итак, вот решение, которое работает для меня. Добавляя следующий метод с аннотацией в контроллере, Spring использует его для создания экземпляра объекта для привязки. Именно то, что мне нужно.

(Я уже пробовал это раньше, но я не указал имя атрибута модели в аннотации, что, очевидно, не очень хорошо).

Спасибо всем, кто прокомментировал предложения.

@ModelAttribute("entity")
public MyEntity getEntity(@RequestParam(required=false) Integer id)
{ 
    if (id == null)
    {
        return myEntityManager.createEntity(entityClass);
    }
    else
    {
        return myEntityManager.find(entityClass, id);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню