본문 바로가기

개발중/Java Persistence API (JPA)

[JPA] 연관 관계 정리

728x90
반응형

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 )

    }

}


 

728x90
반응형