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 |