본문 바로가기

JPA

JPA - 연관관계 주인(feat. mappedBy)

jpa에서는 양방향 연관관계를 설정할 때, 외래키를 관리하는 "연관관계의 주인"을 설정해주어야 한다.

그리고, 연관관계 주인만이 외래키를 관리(등록, 수정)할 수 있다.

(이때, 주인이 아닌 쪽은 읽기만 가능하다.)

 

연관관계 주인 설정

연관관계의 주인이 아닌쪽에 mappedBy 옵션을 넣어주면 된다.

아래는 멤버(N) - 팀(1)의 관계에서의 코드이다.

//Member
@Entity
public class Member {
	
    ...
    @ManyToOne //Member는 연관관계의 주인이다.=
    private Team team;
    ...
}

//Team
@Entity
public class Team{

	...
    @OneToMany (mappedBy = "team") // Team은 Member에 의해 매핑되어 있다!
    private List<Member> Members = new ArrayList<>();
    ... 
    
}

거의 대부분 DB 설계상 외래키를 가진 쪽(N)을 연관관계의 주인으로 설정해주면 된다. 

주의할 점

양방향 관계에서 Insert 할 때, 반드시, 연관관계의 주인쪽에서 값을 넣어주자.

예시) 위 코드 (Member가 주인) 

//잘못된 예시
//주인이 아닌 Team에서 연관관계를 가진 객체 insert 
Member member = new Member();
member.setName("m1");
em.persist(member);

Team team = new Team();
team.setName("t1");
team.getMembers().add(member);
em.persist(team);

==> DB의 Member의 team(team_id) 정보가 저장되지 않는다.
//올바른 예시
//주인인 Member에서 team 설정
Team team = new Team();
team.setName("t1");
em.persist(team);

Member member = new Member();
member.setName("m1");
member.setTeam(team);
em.persist(member);
==> 이렇게 해야, DB에 Member의 team_id가 저장된다.

 가장 올바른 방법) 양쪽 객체에 입력해주는 것. 항상 양쪽에 입력해주자 !!

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

Member member = new Member();
member.setName("m1");
member.setTeam(team);
em.persist(member);

team.getMembers().add(member);

 

'JPA' 카테고리의 다른 글

즉시로딩(EAGER Loading)과 지연로딩(LAZY LOADING)  (0) 2023.05.23
프록시  (0) 2023.05.23
영속성 컨텍스트!  (2) 2023.05.11
자바의 트랜잭션  (0) 2023.05.09
엔티티 매니저와 영속성 컨텍스트 정리  (0) 2023.05.01