Сохранить одновременно составленный объект, используя JpaRepository - PullRequest
0 голосов
/ 27 февраля 2020

Могу ли я сохранить объект, содержащий другой объект, непосредственно в базе данных?

Моя внутренняя структура выглядит следующим образом:

  1. Службы отдыха
  2. Службы
  3. Репозиторий (расширяет JpaRepository)
  4. Модель

Предположим, что в моей модели есть два объекта: Company и Address. Оба сгенерированы инструментом JPA, предоставленным IntelliJ.

Модель класса компании

@Entity
public class Company {
    private int idcompany;
    private String name;
    private Address address;

    @Id
    @Column(name = "idcompany")
    public int getIdcompany() {
        return idcompany;
    }

    public void setIdcompany(int idcompany) {
        this.idcompany = idcompany;
    }

    @Basic
    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @ManyToOne
    @JoinColumn(name = "idaddress", referencedColumnName = "idaddress", nullable = false)
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Модель класса адреса

@Entity
public class Address {
    private long idaddress;
    private String zip;

    @Id
    @Column(name = "idaddress")
    public long getIdaddress() {
        return idaddress;
    }

    public void setIdaddress(long idaddress) {
        this.idaddress = idaddress;
    }

    @Basic
    @Column(name = "zip")
    public String getZip() {
        return zip;
    }

    public void setZip(String zip) {
        this.zip = zip;
    }
}

Кроме того, оба объекта имеют интерфейс, расширяющий интерфейс JpaRepository<T,ID>. Итак, у меня есть CompanyRepository и AddressRepository. Я использую эти два интерфейса в соответствующих классах обслуживания : CompanyService и AddressService. Вот куда я положил бизнес логи c. Все ок !

Теперь я получаю с помощью службы REST через POST объект Company, который содержит объект Address. Мне нужно сохранить их в базе данных (MySql).

В файле json есть Company, который содержит Address!

До сих пор я всегда выполните следующие действия:

  1. Сохраните Address;
  2. Получите Address только что сохраненный (мне нужно idaddress);
  3. Я связываю Address в компанию, используя setAddress;
  4. Сохранить Company

Я попытался сохранить объект Company, полученный через REST, вызвав метод save из CompanyService (используя CompanyRepository), но я получил ошибку:

Column 'idaddress' cannot be null

Прошу вас. Есть ли более простой способ сохранить Company и Address одновременно , используя JpaRepository ???

1 Ответ

1 голос
/ 27 февраля 2020

Вы не определили никакого каскадирования.

Вы можете определить PERSIST, чтобы разрешить сохранение адреса при сохранении Company:

@ManyToOne
@JoinColumn(name = "idaddress", referencedColumnName = "idaddress", nullable = false,
            cascade = CascadeType.PERSIST)
public Address getAddress() {
    return address;
}

Для каждого метода в EntityManager есть Определен CascadeType.

Подробнее о типах каскадов здесь: https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

...