이러한 구조의 연관 관계가 성립 되도록 개발
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
private String city;
private String street;
private String zipcode;
@OneToMany(mappedBy = "memberId") // Order에서 외례키로 설정되어 있는 memberId 변수를 mappedBy로 설정
private List<Order> orderList = new ArrayList<>(); //new ArrayList<>()로 초기화 시켜주는 것이 JPA에서의 관례
}
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue() //Default strategy = auto
@Column(name = "ORDER_ID")
private Long id;
@ManyToOne // N:1 관계; Member가 여러개의 주문을 할 수 있지만, 주문서는 하나의 Member랑만 연관 되어 있음
@JoinColumn(name = "MEMBER_ID") // ... member m JOIN orders o ON m.MEMBER_ID = o.MEMBER_ID;
private Member memberId; // memberId에 Member 객체 자체를 주입 함
private LocalDateTime orderDate;
@Enumerated(value = EnumType.STRING)
private OrderStatus status;
@OneToMany(mappedBy = "orderId")
private List<OrderItem> orderItemList = new ArrayList<>();
}
@Entity
public class OrderItem {
@Id
@GeneratedValue()
@Column(name = "ORDER_ITEM_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order orderId;
@ManyToOne
@JoinColumn(name ="ITEM_ID")
private Item itemId;
private Integer orderPrice;
private Integer count;
}
@Entity
public class Item {
@Id
@GeneratedValue()
@Column(name = "ITEM_ID")
private Long id;
private String name;
private Integer price;
private Integer stockQuantity;
}
양방향 매핑 규칙/주의 사항
1. 연관관계의 객체의 두 관계중 하나를 연관관계의 주인으로 지정합니다. 이때, 주인은 외래키가 있는 객체를 주인으로 합니다. mappedBy = "변수 명" 로 주인이 아닌 객체를 설정합니다.
2. 주인이 아닌쪽은 읽기만 가능
3. 객체 지향적인 설계를 위해서는 연관관계의 양쪽 객체 값들을 서러 설정해 주도록 합니다.예시: orderA.setMemberId(member); member.getOrderList().add(orderA);
4. 단방향만으로도 연관관계 매핑을 완료 할 수 있기 때문에, 먼저 단방향 연관관계를 제대로 설정합니다. 그 이후, 필요한 경우에만 양방향 연관관계 설정
테이블 연관관계 매핑과 달리, 객체들의 양방향 연관관계 설정은 단방향 연관관계를 2번 매핑하는 것입니다. 테이블 연관관계 매핑에서의 True 양방향 연관관계 설정과는 차이가 나는 부분입니다. 또한, 테이블에서는 외래 키 하나로 양쪽 JOIN이 가능하기 때문에, 방향성을 따질 필요가 없습니다.