연관 관계 매핑은 참조하는 방향성을 기준으로 단방향과 양방향으로 구분할 수 있다
그리고 엔티티 간에 참조할 수 있는 객체의 수에 따라서 일대다(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;
}
연관 관계
Hibernate ORM 5.6.14.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
CASCADE
Hibernate ORM 5.6.14.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
'개발일지 > 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 |
연관 관계 매핑은 참조하는 방향성을 기준으로 단방향과 양방향으로 구분할 수 있다
그리고 엔티티 간에 참조할 수 있는 객체의 수에 따라서 일대다(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;
}
연관 관계
Hibernate ORM 5.6.14.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
CASCADE
Hibernate ORM 5.6.14.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
'개발일지 > 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 |