#spring #hibernate #spring-mvc
#весна #спящий режим #spring-mvc
Вопрос:
У меня есть контроллер Spring с кодом, подобным:
@RequestMapping("save")
public String save(@ModelAttribute @Valid Form form, BindingResult result){
if( result.hasErrors()){
[...]
Моя форма содержит список объектов гибернации. У всех установлены их свойства. Я создаю форму редактирования HTML и в контроллере обнаруживаю, что все объекты в отношениях ManyToOne потеряны. У меня есть только идентификатор. Я мог бы перезагрузить данные из базы данных, но уже слишком поздно для проверки, вызванной аннотацией @valid.
public class Form{
@Valid
@NotNull
private List<Item> item;
@NotNull
private Foo foo;
[…]
И элемент
@Entity
@Table(name = "item")
@XmlRootElement
public class Item{
@ManyToOne()
@JoinColumn(name = "dependent", referencedColumnName = "id", nullable = false)
@NotNull
private Dependent dependent;
@NotNull
private Currency currency;
Как я мог бы установить зависимые поля и поля валюты перед проверкой? Есть ли какая-либо альтернатива перезагрузке данных из базы данных?
(Отказ от ответственности некоторые имена были изменены для защиты inocent)
Комментарии:
1. Попробуйте @LazyCollection(LazyCollectionOption. ЛОЖЬ)
2. Я имею в виду для вашего
Dependent
. LazyCollectionOption3. Это решило некоторые из моих проблем, но не все. Форма может добавлять новые элементы, отделенные от базы данных.
Ответ №1:
Если вы используете Spring-Data-JPA, вы можете зарегистрироваться DomainClassConverter
, чтобы выполнить эту работу за вас. В другом случае вы можете написать такой конвертер самостоятельно.
Комментарии:
1. Извините за отсутствие обратной связи. Весенние серверы, похоже, не работают.
Ответ №2:
Я нашел один способ сделать это:
-
Добавьте в контроллер ссылку на SmartValidator.
@Autowired частный валидатор SmartValidator;
-
Удалите аннотацию @valid. Перезагрузите все таблицы ManyToOne и вручную вызовите средство проверки.
@RequestMapping («сохранить») сохранение общедоступной строки (форма формы @ModelAttribute, результат привязки){
for(Item item : form.GetItems()){ item.setDependant( MyDao.reload(item.getDependent()));
}validator.validate (форма, результат);
if( result.hasErrors()){ […]