2012-03-01 13 views
0

私は、1つのクライアントが多くのアドレスエンティティに関連付けることができるマスターと詳細の関係からなるデータモデルを持っています。私は、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; 
    }  
} 

私は、ユーザーがクライアントレコードとアドレスのレコードを追加できるようにするためのフォームを書きたいんですそれと同時に、私のコントローラでは、Clientインスタンスを作成してModelMapに配置します。私はjsp内のClientオブジェクトのフィールドを喜んで参照できますが、Addressオブジェクトのフィールドを参照する方法はわかりません。

org.springframework.beans.InvalidPropertyException以下の例外で<form:input type="text" path="addresses[0].addressLine1" />結果のようなコード:無効なプロパティ 'アドレス[0]' Beanクラスの[com.greenock.saltcam.hibernate.domain.Client] :プロパティのアドレスを取得しようとする不正な試みは例外を投げた。入れ子になった例外はorg.springframework.beans.InvalidPropertyExceptionです:Beanクラス[com.greenock.saltcam.hibernate.domain.Client]のプロパティ 'addresses [0]'が無効です:サイズ0のセットからインデックス0の要素を取得できません。プロパティパス「アドレス[0]」

これは、(セットが空です)不合理として私に当たらないが、それは私が私のコントローラで空のアドレスオブジェクトを作成する必要があることを意味し、およびjspに渡す前にそれをClientオブジェクトにプッシュしますか?ユーザーが任意の数のアドレスを追加できるようにするにはどうすればよいですか?

答えて

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を使用して、即座にアドレスを作成できるということです。

+0

優秀な回答 - ありがとうございます。春は素晴らしいですが、それはそうです_巨大なものです。 – DaveH

1

Hereは私が実装した解決策です。

関連する問題