반응형
객체와 테이블간에 연관관계를 맺는 차이를 이해해야 한다.
- 객체 연관관계 = 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 |