1対多

1対多については、単方向・双方向・JoinTableの3つの方式がある。
□単方向
OrdersオブジェクトからProductオブジェクトに対してのみアクセスする状態

public class Orders implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer ordersId;
    
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "orders_id")
    private Set<Product> products = new HashSet<>();
}

□双方向
双方向関連は、@OneToManyと@ManyToOneの両方のアノテーションが併用されている状態

public class Orders implements Serializable {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "orders")
    private List<Product> products = new ArrayList<>();
}
public class Product implements Serializable {
    @ManyToOne(optional = false)
    private Orders orders;
}

この表記では、mappedByというパラメータを持つOrdersが被所有者側となる。

□1対多の双方向関連:JoinTable
1対多の双方向関連で間に結合テーブルを挟む場合は@JoinTableを使う

public class Orders implements Serializable {
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "orders_product")
    private List<Product> products = new ArrayList<>();
}

orders_productという結合テーブルが生成される。