JPA 를 하면서 테이블간 연관관계 맺기
JPA 에서는 연관 관계를 잘못 맺으면 무한 루프가 .. 발생한다.
고생 좀 했어서 정성스럽게 기록해야지
연관관계 이해하는 예시
"자동차 - 바퀴"
연관관계의 주인은 바퀴가 가지고
자동차는 연관관게를 당하는 입장이다.
아래 두개의 Table 간의 Column 의 연관관계를 맺어보자.
TABLE : MEMBER
COLUMN : M_ID
TABLE : TEAM
COLUMN : T_ID
TEAM
✔ Team
- Team 은 여러명의 Member를 가질 수 있다.
ㄴ 즉, Team 은 연관관계의 주인이 될 수 없다. 위의 예시에서 자동차 같은 역할을 한다.
- Member List 를 담는 변수를 보면 Members 인데 Member 의 Setter 를 보면 setMember 인 것을 볼 수 있다.
Members 니까 setMembers 가 아닌 setMember 이다.
= Data 를 넣을 때 자동 호출이 아닌, 수동 호출이다.
✔ setMember 에서 하는 역할
1. Team 의 mambers 에 전달받은 member 를 add 한다.
2. 전달받은 member 의 기존 Team 과 현재 Team 이 다르다면 현재 Team 을 add 한다.
@OneToMany( mappedBy = "team" )
private List<Member> members;
public void setMember( Member member ){
this.members.add(member);
if( member.getTeam() != this ){
member.setTeam(this);
}
}
MEMBER ( 연관관계의 주인 )
✔ Member
- Member 는 하나의 Team 을 가질 수 있다.
ㄴ 즉, Member 는 연관관계의 주인이 된다. 위의 연관관계 예시에서 바퀴같은 역활을 하기 때문이다.
✔ setTeam 에서 하는 역할
1. Setting 하려는 Team 이 Null 인지 확인한다.
Null 이 아니라면 다른 Team OR 현재 Team 에 속해있다는 뜻,
현재 Team 의 Members에 속해 있는 자신을 remove() 를 통해 삭제 한다.
2. 전달받은 team 객체를 자신의 team 으로 저장 시킨다.
3. 전달받은 team 의 memgers List에 자신이 없다면 추가 시킨다.
@ManyToOne( fetch = "FetchType.LAZY" )
@JoinClumn( name = "T_ID")
private Team team;
public void setTeam( Team team ){
if( this.team!= null ){
this.team.getMembers().remove( this );
}
this.team = team;
if( !team.getMembers().contains( this ) ){
team.setMember( this )
}
}
'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글
[JPA] JPA 의 장점이 뭔지 물어봤을 때 잘 대답하지 못했다. . . (1) | 2022.09.23 |
---|---|
[ JPA ] Save 후 Id 구하기 (0) | 2021.12.05 |
JPQL JOIN (0) | 2021.07.01 |
JPA - 프로젝션 (0) | 2021.07.01 |
JPA - 결과 조회 getResultList/getSingleResult (0) | 2021.07.01 |