У меня есть модель данных, которая состоит из отношения мастер-деталь, где один клиент может быть связан со многими объектами адреса. Я сгенерировал доменные объекты с помощью Hibernate Tools и получил следующие (упрощенные) классы.
Client.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;
}
}
Address.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;
}
}
Я хочу написать форму, которая позволит пользователю добавлять запись клиента и запись адреса одновременно, поэтому в моем контроллере я создаю экземпляр Client и помещаю его в ModelMap. Я могу с удовольствием обратиться к полям объекта Client в моем jsp, но не знаю, как ссылаться на поля в объекте Address.
Код, подобный <form:input type="text" path="addresses[0].addressLine1" />
, приводит к следующему исключению
org.springframework.beans.InvalidPropertyException: недопустимое свойство 'addresss [0]' класса бина [com.greenock.saltcam.hibernate.domain.Client]: недопустимая попытка получить свойство 'addresss; возникла исключительная ситуация; вложенное исключение: org.springframework.beans.InvalidPropertyException: недопустимое свойство 'address [0]' класса компонента [com.greenock.saltcam.hibernate.domain.Client]: невозможно получить элемент с индексом 0 из набора размера 0, доступ к которому осуществляется с помощью свойство path 'address [0]'
Это не кажется мне необоснованным (набор равен пусто), но означает ли это, что мне нужно создать пустой объект Address в моем контроллере и вставить его в к объекту клиента, прежде чем передать его в JSP? Что если я хочу разрешить пользователю добавлять произвольное количество адресов?