spring boot/JPA - 기본

JPA - 연관관계 매핑

ballde 2021. 10. 26. 10:31

단방향 연관관계

@Entity
public class Member {
    ...

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name="TEAM_ID")
    private Team team;

}

음 보기 불편하니까 em.persis() 이런건 생략하겠습니다.

하지만 중요합니다!

Team team = new Team("teamName");

Member member = new Member();
member.setUsername("member1");
member.setTeam(team);


위처럼 team 자체를 넣어주면 된다.

양방향 연관관계

@Entity
public class Member {
    ...

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name="TEAM_ID")
    private Team team;

}
@Entity
public class Team {

    ...
    @OneToMany(mappedBy = "team")   -> Member의 team으로 매핑이 되어있다.
    private List<Member> memberList = new ArrayList<>();
}

객체의 연관관계

  • 회원 연관관계 1개
  • 팀 연관관계 1개

⇒ 양쪽에 참조하는 값이 있음

테이블의 연관관계

회원에 team_id 하나만 있음

💯객체의 참조값이 양쪽에 있기 때문에 둘중에 하나로 외래 키를 관리해야한다

예시) 멤버에서 팀을 바꾸고 싶을 경우

  1. 멤버에 있는 team을 바꿔야하나?
  2. 팀에 있는 memberList를 바꿔야하나?

이런 문제가 있다.

결론적으로 말하자면

  • 연관관계 주인(owner)
  • 연관관계 주인만이 외래키를 관리(등록, 수정)
  • 주인이 아니면 읽기만 가능
  • 주인은 mappedBy 속성 X *****mappedBy속성은 읽기만 가능
  • 💯외래키가 있는 곳을 주인으로!!!!
Team team = new Team("teamName");

Member member = new Member();
member.setUsername("member1");
// member.setTeam(team);

team.getMembers().add(member);

---

member.setTeam(team); 
을 넣지 않으면 멤버에 team_id가 null임
주인이 아니면 읽기만 가능
*****mappedBy속성은 읽기만 가능

이것이 중요~!!!

양방향 연관관계 주의할점

  • 항상 양쪽값을 세팅하자
  • 연관관계 편의 메서드로 표현
Team team = new Team("teamName");

Member member = new Member();
member.setUsername("member1");

member.setTeam(team);
team.getMembers().add(member);
위에 두줄처럼 둘다 세팅해주는게 맞다!!

하나의 메서드로 표현
member.changeTeam(team);

public void changeTeam(Team team) {
    this.team = team;
    team.getMembers().add(this);
}

또는
public void addMember(Member member) {
    member.setTeam(this);
    members.add(member);
}
  • 양방향 매핑시 무한루프를 조심하자

Entity를 반환하지 말자!! dto로 변환해서 반환하자!!

'spring boot > JPA - 기본' 카테고리의 다른 글

JPA - proxy(프록시)  (0) 2021.11.13
JPA - 상속관계 매핑  (0) 2021.11.08
JPA - 연관관계 매핑(2)  (0) 2021.11.08
jpa - 엔티티 매핑  (0) 2021.10.21
JPA - 기본 개념과 영속성  (0) 2021.10.18