双方向OneToManyのEntity

クラス定義概略

../../_images/class_one_to_many.png
  • Companyエンティティ - Employerエンティティ の、双方向1対多の関係を考える。

【Companyエンティティの定義】
@id
@Column(name = "company_id")
String companyId;

@Column(name = "abstract")
String abstract;

@OneToMany(mappedBy = "company", cascade = CascadeType.ALL)
private List<Employer> employers

// 自分自身をthis.employer.companyにset
// + this.employersにemployerエンティティをaddするメソッド
public void add(Employer e){-略-}
【Employerエンティティの定義】
@id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "employer_no")
Integer employerNo;

@Column(name = "name")
String name;

// Companyのcompany_idを外部キーとする項目を持つ
@ManyToOne
@JoinColumn(name = "company_id")
private Company company;

実行例

var c = Company.build() -- .build();
var e = Employer.build() -- .build();

c.add(e) // Entity間の関連付け

repositoy.save(c) // 親エンティティを永続化
Insert company_table (company_id, abstract) Values -略-

// 関連付けされたエンティティも連動してInsertされる。company_idは親と同じ値が入る
Insert employer_table (employer_no, name, company_id) Values -略-

Note

CascadeType.ALLを設定していない場合、親のみInsertされる。
var c = Company.build() -- .build();
var e = Employer.build() -- .build();

c.add(e) // Entity間の関連付け

repositoy.save(e) // 子エンティティを永続化
子のInsert文が発行されたのち、エラー(一時的なエンティティを参照している項目がある旨の文章)
Caused by: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

Note

Insert処理が伝番して行われるのは、所有者側(mappedByが記述されている方)を永続化した場合のみ