반응형
일대다 (1:N)
일대다 관계는 엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션인 Collection, List, Set, Map 중에 하나를 사용해야 한다.
일대다 단방향
하나의 팀은 여러 회원을 참조할 수 있다.
팀 : 회원 = 1 : N
일대단 단방향의 특이한 점은 보통 자신이 매핑할 테이블의 외래키를 관리하는데, 이 매핑은 반대쪽 테이블에 있는 외래 키를 관리한다.(일대다 고나계에서 외래 키는 항상 다쪽 테이블에 존재)
public class Member {
public Member(String id, String username){
this.id = id;
this.username = username;
}
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
}
public class Team {
public Team(String id, String name){
this.id = id;
this.name = name;
}
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List<Member> memberList = new ArrayList<>();
}
일대다 단방향 관계를 매핑할 때는 @JoinColumn을 명시해야 한다.
그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인 테이블(JoinTable) 전략을 기본으로 사용해서 매핑한다.
일대다 단방향 매핑의 단점
매핑한 객체가 관리하는 외래키가 다른 테이블에 있다는 점.(MEMBER테이블에서 TEAM_ID(FK)를 관리하고 있음)
본인 테이블에 외래키가 있으면 엔티티의 저장과 연관관계 처리를 INSERT SQL 한번으로 처리할 수 있지만, 다른 테이블의 외래키가 있으면 연관관계 처리를 위한 UPDATE SQL을 추가로 실행해야 한다.
public void testSave(){
Member member1 = new Member("member1");
Member member2 = new Member("member2");
Team team1 = new Team("team1");
team1.getMemberList().add(member1);
team1.getMemberList().add(member2);
em.persist(member1); // insert member1
em.persist(member2); // insert member2
em.persist(team1); // insert team1, update - member1.fk, member2.fk
}
// insert into Member ...
// insert into Member ...
// insert into Team ...
// update Member set TEAM_ID = ...
// update Member set TEAM_ID = ...
일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자.
일대다 단방향 매핑을 사용하면 엔티티를 매핑한 테이블이 아닌 다른 테이블의 외래 키를 관리해야 한다. (성능 문제도 있지만 관리도 부담스럽다.)
일대다 단방향 매핑 대신 다대일 양방향 매핑을 사용하자.
(다대일 양방향 매핑은 관리해야 하는 외래 키가 본인 테이블에 있음)
반응형
'프로그래밍 노트 > JPA' 카테고리의 다른 글
[JPA] 일대다(1:N), 다대일(N:1) 단방향매핑 관련 고찰 (3) | 2020.12.21 |
---|---|
[QueryDSL] QueryDSL로 SQL Replace 사용하기 (0) | 2020.11.06 |
[JPA] 다양한 연관관계_다대일(N:1) (0) | 2019.10.27 |
[JPA] 연관관계 매핑 기초(단방향/양방향) (5) | 2019.10.10 |
[JPA] 제네릭(generic)한 컨버터(converter) 만들기. Generic Json Converter (0) | 2019.10.10 |