ABAP DUMP ERROR 24시

@joinColumn, @mappedby, 양방향 Mapping시 주의해야할점 본문

[WEB]Back-end/JPA

@joinColumn, @mappedby, 양방향 Mapping시 주의해야할점

이운형 2022. 1. 7. 06:17
반응형

=> 양방향 매핑은 최소화 하여 사용하자

=> 왜래키가 있는 쪽을 주인으로 정하자

=> 연관관계의 주인이 객체를 가져야한다.

 

예시)

Member Team
id id
Team team name
username List members

<Object>

 

Member Team
member_id(pk) Team_id(pk)
Team_id(fk) name
usernaem  

<DB>

 

1. @Joincolumn 이 뭐야?

=> Object의 Member에서 Team team 은 DB에서 Team_id로 되어있다!

 

그럼 이렇게 하는거 아닌가요?

@Column(name ="team_id")
private Team team;

맞다.

그러나 1:다 와 같이 연관관계가 있을 경우 @JoinColumn을 사용한다.

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Team_id")
private Team team;

 

연관 관계의 주인에게는  @JoinColumn을 하인에게는 mappedby를 사용한다.

주인은 그럼 누구?

 

Member Team
member_id(pk) Team_id(pk)
Team_id(fk) name
usernaem  

<DB>

DB테이블을 잘 보면 Team의 Team_id(pk)가 Member의 fk로 속해있는것을 확인할수 있다.

따라서 주인은 " 타 Table의 pk 를 자신이 fk로 갖고있는 Table이 주인이된다."

=> 왜래키가 있는 쪽을 주인으로 정하자

 

 

양방향 연관관계에서 많이 하는 실수 

=> 연관관계의 주인이 객체를 가져야한다.를 생략.

 

위를 java를 활용해서 정리해보면

 

Team team = new Team();

team.setName("TeamA");

em.persist(team);

 

Member member = new Member();

member.setUseranem("member1");

member.setTeam(team); // 다음 part를 빼먹는다.

em.persist(member);

team.getMembers.add(member);

 

이유 : DB에서는 pk 와 fk를 활용하여 자유자재로 join한다.

그러나 객체지향의 spring jpa에서는 @joinColumn을 소유하고 있는 쪽에 직접 코드를 넣어주지 않으면 참조가 이루어지지 않는다. 물론 역으로도 연관관계를 설정해야 1차 캐시로부터 오는 혼돈을 막을수 있다. em.flush(), em.clear()를 넣어야 하는 경우가 생길수 있다.

즉. 양방향 연관관계에서는 주인 하인쪽 모두 연관관계를 넣어주자!

실무에서는 이렇게 코딩하자!

 

Team team = new Team();

team.setName("TeamA");

em.persist(team);

 

Member member = new Member();

member.setUseranem("member1");

member.setTeam(team);

em.persist(member);

team.getMembers.add(member);

 

public class Member{

    public void setTeam(Team team){

        this.team = team;

        this.getMembers.add(this); //  위의 team.getMembers.add(member) 부분을 Member class의 setTeam 메소드에 넣는다.

    }

}

 

=======================================

@Setter는 실무에서 사용하기에 오류가 생길수 있으므로. // setTeam 을 changeTeam으로 바꾸어 사용하자.

 

Team team = new Team();

team.setName("TeamA");

em.persist(team);

 

Member member = new Member();

member.setUseranem("member1");

member.setTeam(team);

em.persist(member);

team.getMembers.add(member);

 

public class Member{

    public void changeTeam(Team team){

        this.team = team;

        this.getMembers.add(this);

    }

}

반응형
Comments