일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Servlet
- 서버 배포
- Chat GPT
- JPA
- git 충돌 해결
- github 복제
- 비밀번호 재설정 API
- JPQL
- MySQL
- 프로그래머스
- 스프링 이메일 전송
- 스프링부트 OpenAI API
- 우분투
- 파이썬
- swap 메모리
- 저장소 복제
- api 개발
- Json 객체
- 저장소 이전
- 자바
- 페이징 정렬
- 넘파이
- 두수의 합 자바
- springboot
- 값 타입
- jar빌드
- MVC
- HttpServletResponse
- JDBC
- Git
- Today
- Total
현의 개발 블로그
[연관관계 매핑] 실전 예제 본문
아래 글과 이어집니다.
[엔티티 매핑] 실전 예제
도메인 모델 분석 회원 - 상품 회원은 상품을 여러 번 주문할 수 있다. 주문 - 상품 주문할 때 여러 상품을 선택 가능하다. 반대로 한 상품을 여러 번 주문할 수 있다. 주문과 상품이 다대다 관계
hyun-keepdeving.tistory.com
테이블 구조
테이블 구조는 기존과 동일하다.
객체 구조
기존에는 외래키를 사용했다면, 이번에는 참조를 사용하도록 수정했다.
단방향 매핑
Member와 Order 관계에서 Order가 N이므로, Order에서 Member를 참조한다.
Order에 Member 아이디 대신 Member 객체를 넣어 단방향 연관관계 매핑을 해준다.
// Order.java
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
OrderItem에도 단방향 연관관계 매핑을 해준다.
@ManyToOne
@JoinColumn(name = "ORDER_ID")
private Order order;
@ManyToOne
@JoinColumn(name = "ITEM_ID")
private Item item;
양방향 매핑
Member에서 Order를 조회할 일은 없지만, 학습을 위해 양방향 매핑을 해보자.
Order에만 Member 참조가 있었는데, Member에 Order 참조를 추가한다.
mappedBy로 Order.member가 연관관계의 주인임을 명시했다.
// Member.java
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
주문에 주문 아이템 참조를 추가하여 양방향 매핑을 해자.
mappedBy로 OrderItem.order가 연관관계의 주인임을 명시했다.
// Order.java
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
연관관계 편의 메서드
양방향 매핑에서 각 객체에 참조값을 넣어줄 때 연관관계 편의 메서드를 작성하는 게 좋다.
아래는 Order 엔티티에서 연관관계 편의 메서드를 정의해
Order.orderItems, OrderItems.order에 각각 참조값을 대입하는 예시이다.
// Order.java
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
// JpaMain.java
Order order = new Order();
order.addOrderItem(new OrderItem());
단방향 연관관계로 매핑하고, 필요할 때 양방향 연관관계로 설정하는 것이 좋다.
단방향으로 설정하고, 아래 코드처럼 OrderItem.order 값만 집어넣어도 무방하다.
Order order = new Order(); em.persist(order); OrderItem orderItem = new OrderItem(); orderItem.setOrder(order); em.persist(orderItem);
정리
양방향 연관관계의 주인이 아닌 쪽은 조회만 가능하다.
따라서 양방향 연관관계는 편의상의 이유로 사용한다.
(ex: Order에서 바로 orderItem를 조회하고 싶다)
실무에서 JPQL을 설계하면 양방향 연관관계가 필요할 때가 있다.
하지만 위 예제에서는 단방향 연관관계가 적절하다.
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'스프링부트 이론 > JPA' 카테고리의 다른 글
[다양한 연관관계 매핑] 일대다 (0) | 2023.05.23 |
---|---|
[다양한 연관관계 매핑] 다대일 (0) | 2023.05.23 |
[연관관계 매핑] 양방향 연관관계 (0) | 2023.05.12 |
[연관관계 매핑 기초] 연관관계 필요성, 단방향 연관관계 (0) | 2023.05.11 |
[엔티티 매핑] 실전 예제 (0) | 2023.05.11 |