2012-03-02 3 views
0

У меня есть объект Client, который «владеет» несколькими объектами Address. Итак, мой класс Клиент определяет набор для хранения объектов адреса следующим образом:Hibernate Master Detail Cascade Insert

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

и мой адрес класс определяет переменную экземпляра клиента, как это:

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

У меня есть форма, которая позволяет пользователю чтобы одновременно вводить данные о клиенте и данные адреса, с сохранением формы, приведет к тому, что Клиент будет сохранен в базе данных, а Cascade приведет к тому, что адрес также будет сохранен.

Я могу заставить это работать, но только если я вручную установил свойство Client в объекте Address в контроллере непосредственно перед тем, как сохранить объект клиента.

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() в Customer, который устанавливает обе стороны ассоциации. Ваш метод setAddresses() мог бы это сделать.

+0

Отлично - спасибо большое – DaveH