2-1. 테이블 연관관계 = 1개
회원 <-> 팀의 연관관계 1개(양방향)
-> MEMBER 테이블 입장에서 TEAM테이블 조인 가능
-> TEAM테이블 입장에서 MEMBER테이블 조인 가능
2-2. 객체 연관관계 = 2개
회원 -> 팀 연관관계 1개(단방향)
팀 -> 회원 연관관계 1개(단방향)
-> 사실은 단방향 연관관계가 2개 있는 것이다.
억지로 양방향이라고 말하는 것
변경된 Team
변경된 Member
//양방향 매핑
Member findSideMember = em.find(Member.class, member.getId());
List<Member> members= findSideMember.getTeam().getMember();
for(Member m : members) {
System.out.println("result = " + m.getUsername());
}
메인단에서 양방향을 위한 메서드를 설정해준다.
✍️양방형이라는 사실을 알 수 있다.
⭐DB는 양방향 관계를 모르기 때문에 JAVA단에서 양방향 관계를 관리한다.
우리는 Team, Member 두 테이블로 나눈다.
1)Member에서 Team으로 외래키 관리 하는 경우는 Member 엔티티를 저장할 때 team 필드를 설정하여 TEAM_ID 컬럼을 업데이트한다. 이 방법을 사용하려면 Member 엔티티에서 team 필드를 수정해야 한다.
2)Team에서 Members로 외래키 관리하는 경우는 Team 엔티티에 새로운 Member를 추가하면 TEAM_ID 컬럼이 업데이트된다. 이 방법을 사용하려면 Team 엔티티에서 member 리스트에 멤버를 추가하면 된다.
코드를 보자. 무엇이 mappedBy가 적혀 있는가? Team이다. 팀 같은 경우 여러 멤버를 선택할 수 있다. 따라서 list를 이용해 매핑해준다.
@ManyToOne @JoinColumn(name = "TEAM_ID")//fk키 걸기 @Setter(value = AccessLevel.NONE) //LOMBOK에서 자동 SETTER를 막는다. private Team team; //Team에서 mappedBy = "team"으로 일치시켜야 함
이 코드는 Member의 부분인데, @JoinColumn 어노테이션을 이용해서 TEAM_ID를 fk값으로 받아왔다. 또한 private Team team은 Team에서 mappedBy한 결과값과 같아야 한다.
JPA에서는 양방향 관계에서 주 관계와 종속 관계를 설정할 수 있다. 주 관계는 외래 키 관리를 담당하며, 종속 관계는 읽기 전용이다. 일반적으로 데이터를 변경하는 엔티티가 주 관계가 되는 것이 좋다.
결국 Member가 주인이므로 주 관계가 된다.
🖊️양방향 매핑시 가장 많이 하는 실수
<Member member = new Member();
member.setUsername("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
team.getMember().add(member);
em.persist(team);
어떤 부분이 문제일까? Member 엔티티와 Team 엔티티의 관계 설정에서 문제가 있었다.
양방향 매핑에서는 Member 엔티티와 Team 엔티티 간의 관계를 상호 설정해야한다. 하지만 이 코드는 team 테이블에 team 엔티티를 설정하고 있지만,Team 엔티티의 member 리스트에 member 엔티티를 추가하지 않고 있기에 문제가 발생했다.
Member member = new Member();
member.setUsername("member1");
em.persist(member);
Team team = new Team();
team.setName("TeamA");
// 양방향 관계 설정
team.getMember().add(member);
member.setTeam(team);
em.persist(team);
이것이 올바른 코드이다.