2012-03-02 77 views
0

我有一個客戶端對象「擁有」一些地址對象。所以,我的客戶端類定義了一組保存地址對象如下:休眠主站詳細級聯插入

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

和我的地址類定義像這樣的客戶實例變量:

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

我有一個表單,允許用戶要同時輸入客戶詳細信息和地址詳細信息,其目的是保存表單將導致客戶端被保存到數據庫,並且級聯將導致地址也被保存。

我可以得到這個工作,但只有在保存客戶端對象之前手動設置控制器中的地址對象上的客戶端屬性。

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屬性的端。

一般而言,負責對象圖的連貫性。因此,在Customer中設置方法addAddress()是一個好主意,該方法設置關聯的兩側。您的setAddresses()方法也可以做到這一點。

+0

非常好 - 非常感謝 – DaveH 2012-03-02 23:36:06