Hibernate Master Detail Cascade Insert

时间:2012-03-02 23:26:04

标签: java hibernate cascade

我有一个“拥有”许多Address对象的Client对象。因此,我的Client类定义了一个用于保存地址对象的集合,如下所示:

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

和我的Address类定义了一个Client实例变量,如下所示:

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

我有一个表单,允许用户同时输入客户端详细信息和地址详细信息,目的是保存表单将导致客户端保存到数据库,并且Cascade将导致该地址也得救了。

我可以让它工作,但只有在我保存客户端对象之前立即在控制器中的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 个答案:

答案 0 :(得分:1)

是的,你需要这样做。 Hibernate查看关联的所有者方以保留它,而所有者方是没有mappedBy属性的一方。

通常,负责对象图的一致性。因此,在Customer中设置方法addAddress()通常是一个好主意,它设置了关联的两个方面。您的setAddresses()方法也可以这样做。