woowacourse-study / 2022-jpa-study

🔥 우아한테크코스 4기 JPA 스터디 (22.06.13~22.07.02) 🔥
5 stars 1 forks source link

[섹션 6, 섹션 7] 루키 제출합니다 #15

Closed wishoon closed 2 years ago

wishoon commented 2 years ago

연관관계 매핑시 고려사항 3가지

다중성

단방향, 양방향

연관관계의 주인


다대일 N : 1

다대일 단방향

public class Member {
    @Id @GeneratedValue(startegy = GenerationType.IDENTIFY)
    private Long id;

    @ManyToOne
    @JoinColum(name = "team_id")
    private Team team;
}

다대일 양방향

public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;

    @ManyToOne
    @JoinColum(name = "team_id")
    private Team team;
}

public class Team {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}


일대다 1 : N

일대다 단방향

public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;
    ...
}

public class Team {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;        
    private String name;

    @OneToMany
    @JoinColumn(name = "team_id")
    private List<Member> members = new ArrayList<>();
}

정리

  • 일대다 단방향 매핑의 단점
  • 엔티티가 관리하는 외래키가 다른 테이블에 있음
  • 연관관계 관리를 위해 추가로 UPDATE SQL 실행
  • 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용
  • 애초에 양방향을 가져가지 말자


일대일 1 : 1

일대일 단방향

public class Locker {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;
    private String name;
}

public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;
    private String username;

    @OneToOne
    @JoinColumn(name ="locker_id")
    private Locker locker;
}

일대일 양방향

public class Locker {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;
    private String name;

    @OneToOne(mappedBy = "locker")
    private Member member;
}

public class Member {
    @Id @GeneratedValue(strategy = GenerationType.IDENTIFY)
    private Long id;
    private String username;

    @OneToOne
    @JoinColumn(name ="locker_id")
    private Locker locker;
}

정리

  • 주 테이블의 외래 키 (일대일 단방향)
  • 주 객체가 대상 객체의 참조를 가지는 것 처럼, 주 테이블에 외래키를 두고 대상 테이블을 찾음
  • 객체지향 개발자가 선호
  • JPA의 매핑이 편리
  • 장점으로 주 테이블만 조회하여도 대상 테이블의 데이터가 있는지 확인 가능
  • 단점으로 값이 없으면 외래 키에 null 허용


상속관계 매핑

상속관계 매핑

상속관계 매핑 - 조인 전략

상속관계 매핑 - 단일 테이블 전략

Mapped Superclass - 매핑 정보 상속