Spring MVC Master Detail Проблемы

У меня есть модель данных, состоящая из отношения мастер-подробности, где один клиент может быть связан со многими сущностями адреса. Я создал объекты домена с помощью Hibernate Tools и получил следующие (упрощенные) классы.

Клиент.java

    @Entity
@Table(name="Client")
public class Client  implements java.io.Serializable {
     private Set<Address> addresses = new HashSet<Address>(0);

@OneToMany(fetch=FetchType.LAZY, mappedBy="client")
    public Set<Address> getAddresses() {
        return this.addresses;
    }

    public void setAddresses(Set<Address> addresses) {
        this.addresses = addresses;
    }

}

Адрес.java

@Entity
@Table(name="Address")
public class Address  implements java.io.Serializable {

     private AddressId id;
     private AddressType addressType;
     private Client client;
     private String addressLine1;



    @AttributeOverrides( {
        @AttributeOverride(name="clientId", column=@Column(name="ClientId", nullable=false) ), 
        @AttributeOverride(name="addressTypeId", column=@Column(name="AddressTypeId", nullable=false) ) } )
    public AddressId getId() {
        return this.id;
    }

    public void setId(AddressId id) {
        this.id = id;
    }

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ClientId", nullable=false, insertable=false, updatable=false)
    public Client getClient() {
        return this.client;
    }

    public void setClient(Client client) {
        this.client = client;
    }    
}

Я хочу написать форму, которая позволяет пользователю одновременно добавлять запись клиента и запись адреса, поэтому в моем контроллере я создаю экземпляр клиента и помещаю его в ModelMap. Я с радостью могу ссылаться на поля объекта Client в моем jsp, но понятия не имею, как обращаться к полям объекта Address.

Код типа <form:input type="text" path="addresses[0].addressLine1" /> приводит к следующему исключению

org.springframework.beans.InvalidPropertyException: недопустимое свойство «адреса [0]» класса компонента [com.greenock.saltcam.hibernate.domain.Client]: незаконная попытка получить свойство «адреса» вызвало исключение; вложенным исключением является org.springframework.beans.InvalidPropertyException: недопустимое свойство «адреса [0]» класса bean [com.greenock.saltcam.hibernate.domain.Client]: невозможно получить элемент с индексом 0 из набора размера 0, доступ к которому осуществляется с помощью путь свойства 'адреса [0]'

Это не кажется мне неразумным (множество is пусто), но означает ли это, что мне нужно создать пустой объект Address в моем контроллере и вставить его в объект Client перед передачей его в jsp? Что, если я хочу разрешить пользователю добавлять произвольное количество адресов?


person DaveH    schedule 01.03.2012    source источник


Ответы (1)


Я бы предложил создать отдельный объект поддержки формы:

import org.springframework.util.AutoPopulatingList;
public class ClientBackingBean {
  private Client client = new Client();
  private List<Address> addresses = new AutoPopulatingList<Address>(Address.class);
  ...
  <getters and setters>
}

Затем поместите один из них в свой ModelMap. Вам просто нужно будет передать данные из вспомогательного компонента в ваши фактические объекты модели в методе контроллера, который обрабатывает публикацию формы. Хорошая вещь в Spring AutoPopulatingList заключается в том, что он будет создавать записи по мере необходимости, поэтому вы можете иметь javascript/jQuery в своем JSP, который создает адреса на лету.

person GriffeyDog    schedule 01.03.2012
comment
Отличный ответ - большое спасибо. Весна прекрасна, но она такая огромная - так много всего, с чем нужно справиться - person DaveH; 02.03.2012