同時に保存JpaRepositoryを使用して合成オブジェクト

ゆがみ:

私は、データベースに直接別のオブジェクトを含むオブジェクトを保存することはできますか?

マイバックエンドの構造は、このようなものです:

  1. 残りのサービス
  2. サービス
  3. リポジトリ(延びJpaRepository
  4. モデル

私は私のモデルで2エンティティがあるとしますCompanyAddressどちらのIntelliJが提供するJPAツールによって生成されました。

会社クラスモデル

@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;
    }
}

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>だから、私は持っているCompanyRepositoryAddressRepository私は、彼らのそれぞれの中でこの2つのインタフェースを使用するサービスクラス:CompanyServiceAddressService私は、ビジネスロジックを置く場所です。すべてOK

今、私はを通じて、RESTサービスを使用してrecive 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

私は尋ねる。そこに保存する簡単な方法であるCompanyAddress 同時に使用してJpaRepository???

サイモン・マルティネリ:

あなたは、任意のカスケードを定義していません。

あなたは、会社が永続化されたときにアドレスを持続させるためにPERSIST定義できます。

@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/

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=15349&siteId=1