일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 매핑정보가없는필드
- Git
- @Table
- 무상태프로토콜
- 네이버로그인API
- HTTPMESSAGE
- fixedDelay
- JPA
- 김영한JPA
- DB방언
- HTTP3
- gitreset
- hibernate.dialect
- 네이버 연결된 서비스
- initialDelay
- RFC723x
- Transaction not successfully started
- 데이터베이스 방언
- SpringBoot
- Invalid bound statement (not found)
- gitrevert
- @Entity
- anyMatch
- 자바ORM표준프로그래밍
- 캐쉬가능
- org.apache.ibatis.binding.BindingException
- ERROR TYPE : org.apache.ibatis.binding.BindingException
- http
- 멱등활용
- KAKAOLOGINAPI
- Today
- Total
twocowsong
일 대 다 본문
1 : N 관계는 N : 1 관계의 반대 방향입니다.
1 : N 관계는 엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션인 Collection, List, Set, Map중에 하나를 사용합니다.
1 : N [일 대 다 단방향]
하나의 팀은 여러 회원을 참조할 수 있습니다. 이런 관계를 1 : N 관계라 합니다.
반대로 회원은 팀을 참조하지 않으면 둘의 관계는 단방향입니다.
[객체 연관관계]
객체 연관관계의 그림을 보면 약간 특이한곳이 있습니다.
팀 엔티티의 Team.member로 회원 테이블 TEAM_ID 외래 키를 관리합니다.
보통 자신이 매핑한 테이블의 외래 키를 관리하는데, 이 매핑은 반대쪽 테이블에 있는 외래 키를 관리합니다.
1 : N 관계에서 외래 키는 항상 N쪽 테이블에 있습니다.
하지만 N 쪽인 Member 엔티티에는 외래 키를 매핑 할 수 있는 참조 필드가 없습니다.
대신에 반대 쪽인 Team 엔티티에만 참조 필드인 members가 있습니다.
따라서 반대편 테이블의 외래키를 거는 특이한 모습이 나타납니다.
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID") // MEMBER테이블의 TEAM_ID (FK)
private List<Member> members = new ArrayList<>();
}
public class Member {
@Id
@Column(name="MEMBER_ID")
private String id;
private String username;
// Getter, Setter...
}
1 : N 단방향 관계를 매핑할 때는 @JoinColumn을 명시해야 합니다.
그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인 테이블 전략을 기본 으로 사용해서 매핑합니다. (추 후 자세하게 공부하겠습니다.)
1 : N 단방향 매핑의 단점
1 : N 단방향 매핑의 단점은 매핑한 객체가 관리하는 외래 키 가 다른 테이블에 있다는 점입니다.
본인 테이블에 외래 키가 있으면 엔티티의 저장과 연관관계 처리를 INSERT SQL 한번으로 끝낼 수 있지만
다른 테이블에 외래 키가 있으면 연관관계 처리를 위한 UPDATE SQL을 추가로 실행해야 합니다.
public void testSave1(EntityManager em) {
Member member1 = new Member("member1");
Member member2 = new Member("member2");
Team team1 = new Team("team1");
team1.getMembers().add(member1);
team1.getMembers().add(member2);
em.persist(member1); // INSERT1
em.persist(member2); // INSERT2
em.persist(team1); // INSERT - team
}
회원1, 회원2, 팀1 을 INSERT하였습니다.
Member 엔티티는 Team엔티티를 모릅니다.
그리고 연관관계에 대한 정보는 Team엔티티의 members가 관리합니다.
따라서 Member 엔티티를 저장할 때는 MEMBER테이블의 TEAM_ID 외래 키에 아무 값도 저장되지 않습니다.
대신 Team 엔티티를 저장할 때 Team.members의 참조 값을 확인해서 회원 테이블에 있는 TEAM_ID외래 키를 업데이트 합니다.
N : 1 양방향 매핑을 사용하자
1 : N 단방향 매핑을 사용하면 엔티티를 매핑한 테이블이 아닌 다른 테이블의 외래 키를 관리합니다.
이것은 성능 문제, 관리문제가 발생할수 있습니다.
그렇기에 N : 1 양방향 매핑을 사용하는 것이 좋습니다.
두 매핑의 테이블 모양은 완전히 같으므로 엔티티만 약간 수정하면됩니다.
'IT > JPA' 카테고리의 다른 글
일 대 일 [ 1 : 1 ] (0) | 2022.06.18 |
---|---|
일 대 다 양방향 (0) | 2022.06.14 |
다 대 일 (0) | 2022.06.12 |
연관관계의 주인(mappedBy) (0) | 2022.06.11 |
정리 (0) | 2022.06.09 |