JPA- 2. 연관관계 매핑 종류

roon-replica·2022년 8월 2일
0

JPA

목록 보기
2/5
  • 참고 자료
    JPA 프로그래밍(김영한)

개요

  • 엔티티 사이의 연관관계에서 고려해야 할 것
    1. 다중성
    2. 방향성
      양방향이면 연관관계 주인까지.

다대일

  • DB 테이블에서 외래 키는 항상 'N'쪽에 있다고 함
  1. 다대일 단방향

  2. 다대일 양방향
    양방향이니 연관관계의 주인 개념이 필요하지
    (ManyToOne,JoinColumn={외래 키}), (OneToMany,mappedBy={참조 필드}) 설정 필요

    그리고 양방향이면 서로 참조해야 해서 연관관계 편의 메소드가 유용함.

일대다

  • 한 팀이 여러 회원을 참조할 수 있는 관계
@Entity
class Team{
  ...
  @OneToMany
  @JoinColumn(name="team_id") // 반대편 테이블의 외래 키를 관리..
  private List<Member> members = new ArrayList<>(); 
  ...
}

일대일

  • 메인 테이블에 외래 키가 있는 것이 좋다고 함...
    메인 테이블은 (게시판, 첨부 파일) 관계에서 게시판쪽이라고 함..

  • 예시) user와 addrress 관계

@Entity
class User{
  ...
  @OneToOne
  @JoinColumn(name = "address_id")
  private Address address;
  ...
}

@Entity
class Address{
  @Id @GeneratedValue
  @Column(name = "address_id")
  private Long id;
  ...
}

다대다

RDB는 다대다 관계 표현이 안 되서 연결 테이블을 사용.

@ManyToMany 쓰면 객체 수준에서는 명시적으로 연결 테이블 안 만들어도
연결 테이블 알아서 만들어주니까 편리할 것 같음..
하지만 연결 테이블로 풀어내서 쓰는게 더 좋다고 함..
회원-상품의 경우 주문이라는 연결 테이블이 생기는데, 주문 테이블에 회원과 상품의 id 값만 담지는 않는다고 함.
주문 수량, 주문 날짜 같은 컬럼이 추가되면 @ManyToMany 못 쓴다고 함..

@ManyToMany
@JoinTable(name = "...", joinColumns=@JoinColumn(name="...'),
			inverseJoinColumns=@JoinColumn(name="..."))
            private List<Item> items = new ArrayList<>();

의문점

  • 방향성 측면에서 양방향 연관관계 쓰이나?

  • 다중성 측면에서 일대다 연관관계 쓰이나?
    책에서는 일대다 단방향보다 다대일 양방향을 쓰라고 권함.
    관리할 외래 키가 다른 테이블에 있는 것은 부담스러운? 일이라고 함..

  • 일대다 관계에서 반대편 테이블의 외래 키를 관리하는게 무슨 일이 일어나는건지 잘 모름

  • 일대다 단방향 관계를 매핑할 때 @JoinColumn을 명시하지 않으면 조인 테이블 전략이 사용된다는데 잘 모름

  • @ManyToMany 못 쓰는 이유 잘 안 와닿음..

profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글