연관 관계 매핑은 참조하는 방향성을 기준으로 단방향과 양방향으로 구분할 수 있다
그리고 엔티티 간에 참조할 수 있는 객체의 수에 따라서 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)로 나눌 수 있다
단방향 연관 관계
한쪽에서만 참조할 수 있는 경우
Member 클래스가 Order 객체를 원소로 포함하고 있으므로, Order를 참조할 수 있다
하지만 Order 클래스는 Member 클래스에 대한 참조 값이 없으므로 Order 입장에서는 Member의 정보를 알 수 없음
양방향 연관 관계
서로 참조할 수 있는 경우
Member 클래스는 Order 객체들을 원소로 포함하고 있고 Order 클래스도 Member 객체를 가지고 있으므로 서로 참조할 수 있다
일대다 (1:N)
일(1)에 해당하는 클래스가 다(N)에 해당하는 객체를 참조할 수 있는 관계
한 명의 회원이 여러 건의 주문을 할 수 있으므로 Member와 Order는 일대다 관계이다
Member가 여러 Order객체들을 참조하고 있는 형태
일대다 관계는 외래 키를 가지고 있어야 할 엔티티에 외래 키 역할을 하는 객체 참조가 없기 때문에 가급적 사용하지 않는 것이 좋다
일대다 양방향 매핑일 경우 @OneToMany의 mappedBy 애트리뷰트 값으로 외래 키 역할을 하는 객체의 필드 이름을 지정한다
예시
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
@Column(length = 100, nullable = false)
private String name;
@OneToMany(mappedBy = "member") // 일대다 관계임을 선언
private List<Order> orders = new ArrayList<>();
}
다대일 (N:1)
반대로 다(N)에 해당하는 클래스가 일(1)에 해당하는 객체를 참조할 수 있는 관계
여러건의 주문은 한 명의 회원에 속할 수 있으므로 Order와 Member는 다대일 관계이다
여러 Order들이 Member객체를 참조하고 있는 형태
@ManyToOne은 다대일에서 '다'에 해당하는 엔티티에서 사용한다
- @JoinColumn의 name 애트리뷰트 값은 테이블 조인 시 사용되는 외래 키가 저장되는 컬럼명을 지정한다
예시
@Entity(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderId;
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus = OrderStatus.ORDER_REQUEST;
@ManyToOne // 다대일 관계임을 선언
@JoinColumn(name = "MEMBER_ID") // MEMBER_ID를 외래키로 가진다
private Member member;
}
다대다 (N:N)
하나의 주문에 여러개의 커피가 속할 수 있고, 하나의 커피는 여러 주문에 속할 수 있으니 다대다 관계이다
테이블 설계 시, 다대다의 관계는 중간에 테이블을 하나 추가해서 두 개의 다대일 단방향 매핑을 적용하고, 필요한 경우 양방향 매핑을 추가하는 식으로 한다
예시
@Entity
public class OrderCoffee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderCoffeeId;
@Column(nullable = false)
private int quantity;
// 다대일 관계를 두번 선언
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name = "COFFEE_ID")
private Coffee coffee;
}
일대일 (1:1)
보통 주 테이블과 부 테이블로 나뉜다
Member가 주테이블로 Stamp의 외래 키를 가지고 있다
@OneToOne 애너테이션을 사용한다는 것 외에 다대일 양방향, 단방향 방식과 동일하다
예시
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
@Column(length = 100, nullable = false)
private String name;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
// 일대일 관계임을 선언
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
@JoinColumn(name = "STAMP_ID") // STAMP_ID를 외래키로 가진다
private Stamp stamp;
}
연관 관계
CASCADE
'개발일지 > Spring' 카테고리의 다른 글
인증서 발급 및 Spring boot에서 HTTPS 서버 구현 (0) | 2022.11.22 |
---|---|
Spring boot - Profile 설정 (0) | 2022.11.15 |
Spring JPA 엔티티 매핑 (0) | 2022.11.05 |
JPA (Java Persistence API) (0) | 2022.11.04 |
Spring - Pagination (0) | 2022.10.31 |