2012-03-01 2 views
0

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

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", [email protected](name="ClientId", nullable=false)), 
     @AttributeOverride(name="addressTypeId", [email protected](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]» свойство Path

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

ответ

0

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

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's AutoPopulatingList заключается в том, что он будет создавать записи по мере необходимости, поэтому у вас может быть javascript/jQuery в вашем JSP, который создает адреса на лету.

+0

Отличный ответ - спасибо большое. Весна велика - но это так-то ужасно - есть так много, чтобы справиться с – DaveH

Смежные вопросы