본문 바로가기

웹개발/Spring

[JPA] 양방향 연관관계

반응형

객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다.

 

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

 

객체의 양방향 관계 
  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 뱡향 관계 2개다. 
  • 따라서, 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.

A -> B (a.getB()) 

class A { 
	B b; 
}

B -> A (b.getA())

class B { 
	A a; 
}

 

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

SELECT * 
FROM TEAM T 
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID

 

 

연관관계의 주인(Owner)

양방향 매핑 규칙 

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정해야 한다. 
  • 외래 키가 있는 곳을 주인으로 정한다. (DB테이블로 따졌을 경우 n쪽)
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정) 
  • 주인이 아닌쪽은 읽기만 가능 
  • 주인은 mappedBy 속성 사용 X 
  • 주인이 아니면 mappedBy 속성으로 주인 지정

 

양방향 매핑시 가장 많이 하는 실수

잘못된 경우 - 연관관계의 주인에 값을 입력하지 않음

Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setName("member1");

//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);

em.persist(member);

 

올바른 경우 - 연관관계의 주인에 값을 입력

(순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하는 것이 좋다.)

Team team = new Team();
team.setName("TeamA");
em.persist(team);

Member member = new Member();
member.setName("member1");

team.getMembers().add(member);

//연관관계의 주인에 값 설정
member.setTeam(team); 

em.persist(member);

 

 

 

참조 - 자바 ORM 표준 JPA 프로그래밍

반응형

'웹개발 > Spring' 카테고리의 다른 글

OSIV란?  (0) 2020.01.20
[JPA] 연관관계 매핑  (0) 2020.01.20
[JPA] 엔티티 매핑 ⭐️ @Entity, @Table, @Column, @Id  (0) 2020.01.17
[JPA] 플러시란? Flush  (0) 2020.01.17
[JPA] 준영속 엔티티란? 변경 감지와 병합(merge)  (0) 2020.01.16