2012-03-02 127 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