JPA - 다양한 연관관계 매핑
연관관계 매핑 종류
JPA에서의 연관계 맺는 ERD에서 맺는 관계를 JPA에서 담당하는 어노테이션에 대한 포스트이다.
- N : 1 - @ManyToOne
- 1 : N - @OneToMany
- 1 : 1 - @OneToOne
- N : N - @ManyToMany
@ManyToOne
- ERD에서 가장 흔히 보는 연관관계이다.
- 다른 큰 주의 사항은 없다. fetch 전략을 LAZY로 잘 설정해 주자.
@OneToMany
- 일대다 단방향은 일(1)쪽이 연관관계의 주인이다.
- @JoinColumn을 꼭 사용해야 한다.
- fetch 전략을 LAZY로 잘 설정해 주자.
- ManyToOne보다는 사용성이 좀 떨어진다.
이유는 관리하는 외래키가 다른곳에 있기 때문에 연관관계를 관리하기 위해서는 추가로 update가 나가야하기 한다. - 양방향으로 사용하는 경우엔 다쪽(N)을 연관관계의 주인으로 지정하여 @OneToMany를 사용하는 필드는 읽기전용으로 사용한다.
@OneToOne
사실상 이 포스트를 쓴 이유 이다. 주의해야하는 관계!
- 일대일 관계는 그 반대도 일대일 관계이다.
- 주 테이블이나 대상 테이블 중에 외래 키 선택이 가능하다.
- LAZY(지연) 로딩이 잘 안됩니다. <- 처음 연관관계 매핑시 상당히 애먹은 부분중 하나
- 지연 로딩을 하기위해 설정해야 할것들이 많다.
- optional=false 옵션을 추가하여 not null이라는것을 jpa에 알려줘야한다.
- 단방향 일대일 관계여야하며 무조건 PK로만 조인해야한다.
jpa가 프록시가 일대일관계의 경우 해당 객체가 존재하는지 존재하지않는지 DB를 조회하지않고 확인할 방법이없다.
최대한 안쓰거나 @MapsId같은 경우로 해결하는 것을 더 권장한다.
@ManyToMany
사실상 이 포스트를 쓴 이유 2 주의해야하는 관계!
RDB에서는 정규화된 테이블 2개를 다대다 관계를 표현할수 없다.
하지만 객체는 컬렉션을 사용해서 표현이 가능하다.
쓰지않는 것을 권장합니다.
매핑테이블을 이용하여 일대다, 다대일관계로 사용하는것이 좋다.
댓글남기기