엔티티의 연관관계를 설정할때 주의해야할 부분들이 있다.
다중성
다중성에는
- 다대일(@ManyToOne)
- 일대다(@OneToMany)
- 일대일(@OneToOne)
- 다대다(@ManyToMany)
가 있다.
다중성을 판단하기 어려울 때는 반대방향을 생각해 보면 된다.
참고로 일대다의 반대 방향은 항상 다대일이고, 일대일의 반대방향은 항상 일대일이다.
일대일 관계에서는 외래키를 어느 테이블에서도 가질 수 있다.
어느 테이블이든 외래키 하나만 있으면 양쪽으로 조회할 수 있다.
주 테이블에 외래키가 있으면 주 테이블이 외래키를 가지고 있으므로 주 테이블만 확인해도 대상 테이블과 연관관계가 있는지 알 수 있고, 대상 테이블에 외래키가 있을때는 일대일에서 일대다로 변경할 때 테이블 구조를 그대로 유지할 수 있다.
단방향, 양방향
테이블은 외래 키 하나로 조인을 사용해서 양방향으로 쿼리가 가능하므로 사실상 방향이라는 개념이 없다.
반면에 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있다.
객체 관계에서 한 쪽만 참조하는 것을 단방향 관계라 하고, 양쪽이 서로 참조하는 것을 양방향 관계라 한다.
일대다 단방향 매핑은 외래키가 다른 테이블에 존재해서 SQL문을 추가로 수행해 성능을 떨어트리고 관리하는데에도 부담이 있는 단점이 있다. 상황에 따라 다르겠지만 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하는것이 좋다.
연관관계 주인
데이터베이스는 외래 키 하나로 두 테이블이 연관관계를 맺는데 테이블의 연관관계를 관리하는 포인트는 외래 키 하나다.
반면에 엔티티를 양방향으로 매핑하면 A -> B, B -> A 2곳에서 서로를 참조한다. 따라서 객체의 연관관계를 관리하는 포인트는 2곳이다.
JPA는 두 객체 연관관계 중 하나를 정해서 데이터베이스 외래 키를 관리하는데 이것을 연관관계의 주인이라 한다.
외래 키를 가진 테이블과 매핑한 엔티티가 외래키를 관리하는게 효율적이므로 보통 이곳을 연관관계의 주인으로 선택한다.
주인이 아닌 방향은 외래키를 변경할 수 없고 읽기만 가능하다.
- 다대일 : 단방향, 양방향
- 일대다 : 단방향, 양방향
- 일대일 : 주 테이블 단방향, 양방향
- 일대일 : 대상 테이블 단방향, 양방향
- 다대다 : 단방향, 양방향
'JPA' 카테고리의 다른 글
@MappedSuperclass를 이용한 객체 상속 (0) | 2021.12.31 |
---|---|
엔티티 상속 관계 매핑 (0) | 2021.12.31 |
엔티티 연관 관계 매핑 어노테이션 정리 (0) | 2021.12.30 |
하이버네이트(Hidernate) 설명 및 설정법 (0) | 2021.12.28 |
엔티티 매핑 어노테이션 정리 (0) | 2021.12.28 |