私は、データベースに直接別のオブジェクトを含むオブジェクトを保存することはできますか?
マイバックエンドの構造は、このようなものです:
- 残りのサービス
- サービス
- リポジトリ(延び
JpaRepository
) - モデル
私は私のモデルで2エンティティがあるとしますCompany
とAddress
。どちらの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>
。だから、私は持っているCompanyRepository
とAddressRepository
。私は、彼らのそれぞれの中でこの2つのインタフェースを使用するサービスクラス:CompanyService
とAddressService
。私は、ビジネスロジックを置く場所です。すべてOK!
今、私はを通じて、RESTサービスを使用してrecive POST対象Company
のオブジェクトが含まれていますAddress
。私は、データベース(MySQLの)にそれらを保存する必要があります。
JSONファイルであるCompany
ことが含まれていますAddress
!
今までは、私は常にこれらの手順を行ってきました:
- 保存
Address
; - 取得
Address
だけで保存されたが(私が必要idaddress
)。 - 私は関連付ける
Address
使用して会社にsetAddress
。 - セーブ
Company
私は、オブジェクト保存しようとしたCompany
メソッドを呼び出すRESTを介して受信されたsave
からCompanyService
(使用CompanyRepository
)が、私はエラーを得ました:
Column 'idaddress' cannot be null
私は尋ねる。そこに保存する簡単な方法であるCompany
とAddress
同時に使用して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/