자바 ORM 표준 JPA 프로그래밍 6장 정리
일대다, 일대일
- 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용해야 함
- 외래키 관리를 '다'쪽이 하는 것이 좋음
- 다른 테이블의 외래키를 관리하는 것이 성능, 관리 이슈가 있기 때문
- 일대일 관계에서는 어느쪽이든 외래키를 가질 수 있음
- 주 테이블에 외래 키를 두면 주 객체가 대상 객체를 참조하는 것처럼 객체지향적으로 사용 가능
- 대상 테이블에 외래 키를 두면 전통적인 데이터베이스와 같음
다대다
- 관계형 데이터베이스는 정규화된 테이블로 다대다 관계를 표현할 수 없기 때문에 중계 테이블을 사용해서 풀어냄
- 객체는 테이블과 다르게 객체 2개로 다대다 관계를 만들 수 있음
- @ManyToMany를 사용해서 매핑
- @JoinTable -> name : 연결 테이블 이름 지정, joinColumns : 현재 방향 매핑할 조인 컬럼 정보 지정, inverseJoinColumns : 반대 방향 조인 컬럼 정보 지정
- getter로 대상 탐색하면 이너 조인 쿼리 날라감
- 양방향은 대상 엔터티에 mappedBy 추가하자
- 객체 2개로 다대다 관계를 만드는 방법은 단순하고 편리하지만 실무에서 사용하기엔 한계가 있음, 중계 테이블에도 FK를 제외한 컬럼들이 필요할 수 있기 때문, 복합키 엔터티로 다대다 관계 만들 수 있음
- 중계 엔터티를 직접 만들어 사용, 별도의 식별자 클래스 만들어야함
- @IdClass 어노테이션을 사용하여 다중 컬럼(이어줄 두 FK)을 기본 키로 생성
- 복합키는 Serializable, equlas, hashCode를 구현해야 함, 기본 생성자 있어야 함, public이어야 함
- @IdClass 사용하는 방법 외 @EmbeddedId 사용하는 방법도 있음
- 이렇게 부모 테이블의 기본 키를 받아서 자신의 기본키 + 외래 키로 사용하는 것을 식별 관계라 함
- ORM 매핑에서 처리할 일이 많아지고 복잡함
- 다대다를 새로운 기본키 사용해서 구현하는 방법
- 자신만의 PK를 가지고 연결할 두 엔터티의 FK를 가지는 중계 엔터티를 사용하는 방법
- 앞선 복합 키 방법에 비해 식별자 클래스를 사용하지 않아서 복잡하지 않음