JPA/연관관계 Mapping

[JPA] 양방향 연관관계와 연관관계 주인1 - 기본

Boradoris 2023. 2. 26. 21:09

양방향 매핑

 

  • [Member → Team] 단방향 연관관계 상태에서 양방향 매핑
  • Team 객체에 List members 추가
  • TEAM 테이블 변화 X

 

(Member 엔티티는 단방향과 동일)

@Entity
public class Member { 

 @Id @GeneratedValue
 private Long id;
 
 @Column(name = "USERNAME")
 private String name;
 
 private int age;
 
 @ManyToOne
 @JoinColumn(name = "TEAM_ID")
 private Team team;
 …

 

(Team 엔티티는 컬렉션 추가)

@Entity
public class Team {
 
 @Id @GeneratedValue
 private Long id;
 
 private String name;
 
 @OneToMany(mappedBy = "team")
 List<Member> members = new ArrayList<Member>();
 … 
 }

 

  • @OneToMany : 해당 객체와 일대다 관계
  • mappedBy : 연관관계의 주인 설정 (뒤에 설명)

 

(반대 방향으로 객체 그래프 탐색)

 //조회
 Team findTeam = em.find(Team.class, team.getId()); 
 
 //역방향 조회
 int memberSize = findTeam.getMembers().size();

 

 

연관관계의 주인과 mappedBy

  • mappedBy = C언어의 포인터 같은 느낌
  • 객체와 테이블 간에 연관관계를 맺는 차이를 이해해야 함

 

객체와 테이블이 관계를 맺는 차이

  • 객체 연관관계 = 2개
    • 회원 -> 팀 연관관계 1개(단방향) 
    • 팀 -> 회원 연관관계 1개(단방향) 

  • 테이블 연관관계 = 1개
    • 회원 <-> 팀의 연관관계 1개(양방향)

 

 

  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다. 
  • A -> B (a.getB()) 
  • B -> A (b.getA())

 

테이블의 양방향 연관관계

  • 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
  • MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계 가짐
    (양쪽으로 조인할 수 있다.)

 

 

둘 중 하나로 외래 키를 관리해야 한다.

 

연관관계의 주인 (Owner)

양방향 매핑 규칙

  • 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정) 
  • 주인이 아닌 쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용 X 
  • 주인이 아니면 mappedBy 속성으로 주인 지정

 

누구를 주인으로?

  • 외래 키가 있는 있는 곳을 주인으로 정하기
  • 여기서는 Member.team이 연관관계의 주인

 

 


출처 : https://www.inflearn.com/course/ORM-JPA-Basic