본문 바로가기

Web/JPA

연관관계 매핑 기초

회원 ( Member ) : N
팀 ( Team ) : 1

회원과 팀은 다대일의 관계

  : 1개의 팀에 여러명의 회원이 있다.

 

테이블 → '외래키'로 조인

객체 → 참조 ex) member.getId()

 

* 단방향

@ManyToOne
@JoinColumn(name = "Team_ID")
private Team team;

* 양방향 연관관계

 - 양방향 매핑 ( 반대방향으로 객체 그래프 탐색 )

@OneToMany(mappedBy = "team") // team 은 Member 클래스에 있는 Team 의 변수명
List<Member> members = new ArrayList<>();

mappedBy 를 알기 위해선...객체와 테이블이 관계를 맺는 차이 알아야됨.

 

*객체와 테이블이 관계를 맺는 차이

 객체 연관관계 = 2개
회원 → 팀 : 연관관계 1개 (단방향)
팀 → 회원 : 연관관계 1개 (단방향) <객체는 단방향으로 왔다갔다 하는것 편의상 양방향>

테이블 연관관계 = 1개
회원 ↔ 팀 : 연관관계 1개 (양방향) <사실 테이블은 방향이 없음 편의상 양방향>

* 연관관계의 주인 

 -양방향 매핑 규칙

  : 객체의 두 관계중 하나를 주인으로 지정

  : 테이블에 외래키가 있는 곳을 주인으로 정함

  : 주인이 아니면 읽기만 가능

  : 주인은 mappedBy 속성 사용 X

  : 주인이 아니면 mappedBy 속성으로 주인 지정

 

* 많이 하는 실수

 - 양방향 연관관계 주인을 설정하지 않음

 - 순수 객체상태를 고려해서 항상 양쪽에 값을 설정하자

    : flush(), clear() 를 안하면 1차 캐시에서 찾아오기 때문에 아무것도 출력이 안됨

      Test 단계에서 문제 발생

 - 연관관계 편의 메서드 생성


Member Class //연관관계 주인
public void changeTeam(Team team) {
        this.team = team;
        team.getMembers().add(this);
    }
    
 Team Class   //연관관계 쫄따구
 public void addMember(Member member){
            member.setTeam(this);
            members.add(member);
    }

 - 양방향 매핑시 무한로프 조심

  ex) toString, lombok, JSON

 

* 단방향 매핑만으로 이미 연관관계 매핑은 완료

'Web > JPA' 카테고리의 다른 글

고급매핑  (0) 2020.02.03
다양한 연관관계 매핑  (0) 2020.02.02
엔티티 매핑  (0) 2020.01.31
플러시  (0) 2020.01.30
영속성 관리 && 준영속성  (0) 2020.01.29