【问题标题】:Spring MVC Master Detail ProblemsSpring MVC 主从问题
【发布时间】:2012-03-01 18:39:18
【问题描述】:

我有一个数据模型,它由一个主从关系组成,其中一个客户端可以与许多地址实体相关联。我已经使用 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 中。我可以愉快地在我的 jsp 中引用 Client 对象上的字段,但不知道如何引用 Address 对象中的字段。

&lt;form:input type="text" path="addresses[0].addressLine1" /&gt; 之类的代码会导致以下异常

org.springframework.beans.InvalidPropertyException:bean 类 [com.greenock.saltcam.hibernate.domain.Client] 的无效属性“地址 [0]”:非法尝试获取属性“地址”引发异常;嵌套异常是 org.springframework.beans.InvalidPropertyException:bean 类 [com.greenock.saltcam.hibernate.domain.Client] 的无效属性“地址 [0]”:无法从大小为 0 的集合中获取索引为 0 的元素,使用访问属性路径“地址[0]”

这并没有让我觉得不合理(集合 is 为空),但这是否意味着我需要在我的控制器中创建一个空的 Address 对象并推送在将它传递给jsp之前将它传递给Client对象?如果我想允许用户添加任意​​数量的地址怎么办?

【问题讨论】:

    标签: java spring-mvc master-detail


    【解决方案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。您只需将数据从支持 bean 传输到处理表单发布的控制器方法中的实际模型对象。 Spring 的AutoPopulatingList 的好处在于它会根据需要创建条目,因此您可以在 JSP 中使用 javascript/jQuery 动态创建地址。

    【讨论】:

    • 很好的答案 - 非常感谢。春天很棒 - 但它是如此巨大 - 有很多东西需要处理
    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多