我有一个数据模型,它由主 - 详细关系组成,其中一个客户端可以与许多地址实体相关。我使用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中。我很乐意在jsp中引用Client对象上的字段,但不知道如何引用Address对象中的字段。
<form:input type="text" path="addresses[0].addressLine1" />
之类的代码会导致以下异常
org.springframework.beans.InvalidPropertyException:bean类[com.greenock.saltcam.hibernate.domain.Client]的属性'addresses [0]'无效:非法尝试获取属性'address'引发异常;嵌套异常是org.springframework.beans.InvalidPropertyException:bean类[com.greenock.saltcam.hibernate.domain.Client]的属性'addresses [0]'无效:无法从大小为0的Set中获取索引为0的元素,使用属性路径'地址[0]'
这不会让我觉得不合理( 设置为空),但这是否意味着我需要在控制器中创建一个空的Address对象并推送在将它传递给jsp之前将它放入Client对象中?如果我想允许用户添加任意数量的地址怎么办?
答案 0 :(得分:1)
Here是我实施的解决方案。
答案 1 :(得分: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
。您只需将数据从辅助bean传输到处理表单的控制器方法中的实际模型对象。关于Spring AutoPopulatingList
的好处是它会根据需要创建条目,因此你可以在JSP中使用javascript / jQuery来动态创建地址。