一対多によるリレーション


自分用の備忘録も兼ねて実装にあたり苦労したので投稿します。

概要

  • レストラン(親)は複数のメニュー(子)を持つ関係
  • Java、SpringBootにて一対多によるリレーションを関係するエンティティに記述
  • 親テーブル(@OneToMany)、子テーブル(@ManyToOne)使用

親テーブル

RestaurantsEntity.java
@Entity
@Table(name="restaurants")
public class RestaurantsEntity {

  //各フィールド変数記述 略……

  @OneToMany(mappedBy="restaurantId")
  private List<RestaurantMenuEntity> restaurantMenuEntityList;

  //下記setter/getter 略……    

}

「一対多」の一側のフィールドには、多側のエンティティのコレクションを保持させてます(private List<RestaurantMenuEntity> restaurantMenuEntityList;)。

@OneToManyアノテーションを付与し、mappedByで関連させる多側エンティティのフィールドを指定してます(mappedBy="restaurantId")。

子テーブル

RestaurantMenuEntity.java
@Table(name="restaurantMenu")
public class RestaurantMenuEntity {

  //各フィールド変数記述 略……

     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "restaurantId")
     private RestaurantMenuEntity restaurantId;

  //下記setter/getter 略……    

}

「多対一」の多側のフィールドには、一側のエンティティを保持させてます(private RestaurantMenuEntity restaurantId;)。

@ManyToOneアノテーションを付与することで、リレーションシップを定義しています。

nameで関連テーブルを結合させるために使用するカラム名を指定してます(name = "restaurantId")。

あとがき

まだまだ全てを理解できているわけではありませんが、ひとまず実装できました。