김영한님의 인프런 강의 '자바 ORM 표준 JPA 프로그래밍'을 참고했습니다.
가장 많이 사용하는 연관관계 👍
@ManyToOne
속성 | 설명 | 기본값 |
---|---|---|
Optional | false로 설정하면 연관된 엔티티가 항상 있어야 한다. | TRUE |
fetch | 글로벌 페치 전략을 설정한다. | FetchType.EAGER |
cascade | 영속성 전이 기능을 사용한다. |
일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인
테이블 일대다 관계는 항상 다(N) 쪽에 외래 키가 있음
객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하
는 특이한 구조
엔티티가 관리하는 외래 키가 다른 테이블에 있어서 추가로 UPDATE SQL을 실행하므로 성능이 떨어짐
일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자.
JPA에서 공식적으로 지원 안함
야매로 하는 법 (insertable, updatable 활용)이 있지만 권장 X
다대일 양방향을 사용하자
OneToMany
속성 | 설명 | 기본값 |
---|---|---|
mappedBy | 연관관계의 주인 필드를 선택한다. | |
fetch | 글로벌 페치 전략을 설정한다. | FetchType.LAZY |
cascade | 영속성 전이 기능을 사용한다. |
주 테이블이나 대상 테이블 중에 외래 키 선택 가능.
여기서 주 테이블이란 주로 access하는 테이블을 의미.
외래 키에 데이터베이스 유니크(UNI) 제약조건 추가.
단방향 관계는 JPA가 지원 안함
김영한 선생님께서는 주 테이블에 외래 키 단방향 선호. BUT 정답은 없음. DBA분과 잘 협의해야 함🤝.
관계형 데이터베이스는 객체와 달리 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
JPA는 중간에 연결 테이블을 자동으로 처리해 주는 @ManyToMany
를 지원해 주지만
* @ManyToMany
는 연결 테이블에 컬럼을 추가할 시 매핑이 깨진다는 단점이 있어서 실무에서는 사용하지 않는다.
🤔 why -> 주문 엔티티나 상품 엔티티에는 추가한 컬럼들을 매핑할 수 없어서.
따라서 위 그림처럼 연결 테이블을 매핑하는 연결 엔티티를 만들고 다대다에서 일대다, 다대일 관계로 풀어야 한다.