728x90
- Member가 연관관계 주인이고(외래키 있는 다쪽인 곳), Team은 연관관계 주인이 아닐 때,
- 다음 코드를 통해 다대일 양방향 관계를 알아보자
@Entity
public class Member { //member 엔티티
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
public void setTeam(Team team) {
this.team = team;
//무한 루프에 빠지지 않도록 체크
if(!team.getMembers().contains(this)){
team.getMembers().add(this);
}
}
@Entity
public class Team { //team 엔티티
@Id @GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<Member>();
public void addMember (Member member) {
this.members.add(member);
if (member.getTeam() != this){
member.setTeam(this)
}
}
...
}
- 양방향은 외래키가 있는 쪽이 연관관계의 주인이다.
- 일대다와 다대일 연관관계는 항상 다(N)에 외래 키가 있다.
- 여기서는 다쪽인 MEMBER 테이블이 외래 키를 가지고 있으므로 Member.team이 연관관계의 주인이다.
- JPA는 외래 키를 관리할 때 연관관계의 주인만 사용한다.
- 주인이 아닌 Team.members는 조회를 위한 JPQL이나 객체 그래프를 탐색할 때 사용한다.
- 양방향 연관관계는 항상 서로를 참조해야한다.
- 항상 서로 참조하게 하려면 연관관계 편의 메소드를 작성하는 것이 좋은데 회원의 setTeam(), 팀의 addMember() 메소드가 이런 편의 메소드들이다.
- 위에 예제 코드는 편의 메소드를 양쪽에 다 작성해서 둘 중 하나만 호출하면 된다.
출처 : 자바 표준 ORM JPA 프로그래밍 (저자 김영한)
728x90
'JPA' 카테고리의 다른 글
임베디드 타입(@Embeddable, @Embedded) (0) | 2022.06.13 |
---|---|
@MappedSuperclass (0) | 2022.06.13 |
연관관계 편의 메소드 작성 시 주의사항(part.2) (0) | 2022.06.12 |
연관관계 편의 메소드(part.1) (0) | 2022.06.12 |
고아 객체(feat. orphanRemoval) (0) | 2022.06.12 |