📚 Study

JPA 연관관계 매핑 정리

date
Aug 23, 2023
slug
jpa-mapping
author
status
Public
category
📚 Study
tags
JPA
summary
일대일, 다대일, 다대다 완전정복!
type
Post
thumbnail
스크린샷 2023-08-23 오전 10.22.31.png
 

Entity

  • Member
  • Team
@Entity public class Member { @Id private Long id; private String name; } @Entity public class Team { @Id private Long id; private String teamName; }

1:1 일대일 단방향 (멤버:사물함)

  • 하나의 멤버가 하나의 사물함을 바라봄
  • 멤버는 자신의 사물함을 알 수 있음, 사물함은 자신의 멤버를 알 수 없음
  • fk는 왼쪽인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="locker_id") @OneToOne private Locker locker; } @Entity public class Locker { @Id private Long id; private String lockerName; }
notion image

1:1 일대일 양방향 (멤버:사물함)

  • 하나의 멤버가 하나의 사물함을 바라봄
  • 멤버는 자신의 사물함을 알 수 있음, 사물함도 자신의 멤버를 알 수 있음
  • fk는 왼쪽인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="locker_id") @OneToOne private Locker locker; } @Entity public class Locker { @Id private Long id; private String lockerName; @OneToOne(mappedBy="locker") private Member member; }
notion image

N:1 다대일 단방향

  • 다수의 멤버하나의 팀을 바라봄
  • 멤버만 팀을 알 수 있음, 팀은 속한 멤버를 알 수 없음
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="team_id") @ManyToOne private Team team; } @Entity public class Team { @Id private Long id; private String teamName; }
notion image

N:1 다대일 양방향

  • 다수의 멤버하나의 팀을 바라봄
  • 멤버는 팀을 알 수 있고, 팀도 자신에게 속한 멤버를 알 수 있음
  • fk는 다수인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @ManyToOne @JoinColumn(name="team_id") private Team team; } @Entity public class Team { @Id private Long id; private String teamName; @OneToMany(mappedBy="team") private List<Member> members; }
notion image

1:N 일대다 단방향

  • 하나의 팀이 여러 명의 팀을 바라봄
  • 팀은 자신에게 속한 멤버를 알 수 있음, 멤버는 자신의 팀을 알 수 없음
  • fk는 다수인 멤버가 가진다
    • 그러나 왼쪽인 팀에서 참조하여 반대편 테이블의 외래 키를 관리한다
    • 일대다 단방향 매핑은 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있음
    • -> 단점!! 차라리 다대일(N:1) 양방향을 사용하라
@Entity public class Member { @Id private Long id; private String name; } @Entity public class Team { @Id private Long id; private String teamName; @OneToMany @JoinColumn(name="team_id") private List<Member> members; }
notion image

1:N 일대다 양방향

  • 하나의 팀이 여러 명의 멤버를 바라봄
  • 팀은 자신에게 속한 멤버를 알 수 있음, 멤버도 자신의 팀을 알 수 있음
  • fk는 다수인 멤버가 가진다
    • 그러나 왼쪽인 팀에서 참조하여 반대편 테이블의 외래 키를 관리한다
@Entity public class Member { @Id private Long id; private String name; @ManyToOne @JoinColumn(name="team_id", insertable=false, updatable=false) private Team team; } @Entity public class Team { @Id private Long id; private String teamName; @OneToMany @JoinColumn(name="team_id") private List<Member> members; }
notion image

N:N 다대다

  • 여러 명의 멤버가 여러 개의 물건을 바라봄
  • 멤버는 자신의 물건을 알 수 있음, 물건도 자신을 구매한 멤버를 알 수 있음
  • fk는 왼쪽인 멤버가 가진다
@Entity public class Member { @Id private Long id; private String name; @JoinColumn(name="product_id") @ManyToMany private List<Product> productList; } @Entity public class Product { @Id private Long id; private String productName; @ManyToMany(mappedBy="productList") private List<Member> memberList; }
notion image
 
참조