2012-03-02 15 views
0

私は、多くのAddressオブジェクトを「所有している」Clientオブジェクトを持っています。だから、私のクライアントクラスは、次のようにアドレスオブジェクトを保持するためのセットを定義しています。Hibernateマスター詳細カスケード挿入

@OneToMany(fetch=FetchType.LAZY, mappedBy="client", cascade={CascadeType.ALL}) 

と私のアドレスクラスは、このようなクライアントのインスタンス変数を定義しています

@ManyToOne(fetch=FetchType.LAZY) 
@JoinColumn(name="ClientId", nullable=false) 

私は、ユーザーを許可するフォームを持っていますクライアントの詳細とアドレスの詳細を同時に入力します。フォームを保存するとクライアントがデータベースに保存され、カスケードによってアドレスも保存されます。

クライアントオブジェクトを保存する直前に、コントローラのAddressオブジェクトにClientプロパティを手動で設定した場合にのみ、これが動作するようになります。

public String clientSave(@ModelAttribute("form") AddClientForm form, ModelMap model) { 
    logger.debug("clientsave"); 
    Client client = form.getClient(); 

    HashSet<Address> addresses = new HashSet<Address>(form.getAddresses()); 

    // TODO - Should I have to do this? 
    for (Address a : addresses){ 
     a.setClient(client); 
    } 

    client.setAddresses(addresses); 

    clientService.saveClient(client); 

これを行う必要がありますか、何か不足していますか?

答えて

1

はい、これを行う必要があります。 Hibernateはそれを保持するためにアソシエーションの所有者側を調べ、オーナー側はmappedByアトリビュートを持たない側です。

一般には、オブジェクトグラフの一貫性を担います。したがって、多くの場合、アソシエーションの両側を設定するメソッドaddAddress()を顧客に持たせることをお勧めします。あなたのsetAddresses()メソッドもそうすることができます。

+0

優秀 - ありがとう – DaveH

関連する問題