Hibernate Master Detail Каскадная Вставка - PullRequest
1 голос
/ 03 марта 2012

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

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

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

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

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

Я могу заставить это работать, но только если я вручную установлю свойство Client для объекта 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 Ответ

1 голос
/ 03 марта 2012

Да, вам нужно сделать это.Hibernate смотрит на сторону владельца ассоциации, чтобы сохранить ее, а сторона владельца - это сторона, у которой нет атрибута mappedBy.

В целом, вы несете ответственность засогласованность графа объекта.Поэтому часто неплохо иметь метод addAddress() в Customer, который устанавливает обе стороны ассоциации.Ваш setAddresses() метод тоже может это сделать.

...