양방향 연관관계의 매핑
@Entity(name = "Member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Setter
public class Member {
@Id
@Column(name = "MEMBER_ID")
private String id;
private String username;
// 연관관계 매핑
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
public Member(String id, String username) {
this.id = id;
this.username = username;
}
}
@Entity
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Getter
public class Team {
@Id
@Column(name = "TEAM_ID")
private String id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
- 다대다 설정 Team 에 회원이 여러명
- Member 는 하나의 팀만 들어갈수있다
- 조회해보자
@Test
void find_team1_all_member() {
Team team1 = em
.find(Team.class, "team1");
List<Member> members = team1.getMembers();
for (Member member : members) {
System.out.println("member = " + member.getUsername());
}
}
- 단순히 이렇게만 조회하면 당연히 값이 안나온다.
- 왜냐?
- 양방향 연관관계에서 member에서만 팀을 설정해주고 team 에서는 member 를 추가해주지 않았기 때문이다.
- 고로.. 아래의 코드 처리가 필요하다
public void setTeam(Team team) {
this.team = team;
team
.getMembers()
.add(this);
}
- 위 코드는 안전해보이나요?
- 아니다,
- 만약 member에서 team1 을 지우지 않은 상태에서 team2 로 변경하게 된다면
- team1 은 여전히 Member 를 가지고 있지만,
- Member는 team2 와의 관계를 가지게 되기 때문에
- 데이터의 무결성을 해치게 된다.
- 아니다,
- 고로 아래의 안전장치가 필요하다.
public void setTeam(Team team) {
if (this.team != null) {
this.team
.getMembers()
.remove(this);
}
this.team = team;
team
.getMembers()
.add(this);
}
- team 이설정이 되어있는 경우
- 별도 team 안에서 해당 team 객체를 지워주면 된다.
이제 올바르게 출력된다
insert into member (team_id, username, member_id) values ('team1', '회원1', 'member1');
member = 회원1 (출력!)
Uploaded by N2T
'자바 > JPA' 카테고리의 다른 글
[5단원] `@JoinColumn` , `@ManyToOne` (0) | 2023.11.01 |
---|---|
[5단원] 연관관계의 사용 (0) | 2023.11.01 |
[5단원] 양방향 매핑의 규칙 : 연관관계의 주인 (0) | 2023.11.01 |
[6단원] 다대일 단방향 [N:1] 연관관계 (0) | 2023.11.01 |
[6단원] 일대다 단방향 관계[1:N] (0) | 2023.11.01 |