단방향 연관관계

  • MEMBER와 TEAM 테이블이 있음
  • 이때 관계는 1(팀):N(멤버) 임
  • JPA를 이용해 테이블을 만들고 관계를 맺어줄 때

 

// Member
@Entity
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

//    @Column(name = "TEAM_ID")
//    private Long teamId;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}
  • 위와 같이 멤버의 외래키에 @ManyToOne과 @JoinColumn 어노테이션을 사용해
  • 외래키를 지정해줌

 

@Entity
public class Team {

    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    private String name;
}

 

Team team = new Team();
team.setName("TeamA");
em.persist(team);

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

Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();

System.out.println("findTeam = " + findTeam.getName());
  • 이렇게 지정해주면 위와 같이 setTeam에 그냥 team을 넣으면 TEAM_ID로 조인시켜서 저장하고 찾아준다.

 

양방향 연관관계

  • 위와 같이 되면 Member와 Team객체는 서로 알 방법이 객체지향스럽지 못하다.
  • Member에서는 Team이란 필드가 있으니 쉽게 알 수 있지만, Team에서는 Member를 조회하려면
  • 객체지향스럽지 못하게 조회할 수 밖에 없다.
  • 테이블에서는 외래키를 이용해 양쪽에서 조인을 사용해 알 수 있다
  • 이를 해결하기 위해 아래와 같이 한다.
@Entity
public class Team {

    @Id
    @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}
  • 위와 같이 팀에서 멤버를 조회할 수 있도록 리스트로 members라는 변수를 만들고
  • @OneToMany(mappedBy = "team")으로 어노테이션을 달아준다.
  • 이러면 아래와 같이 사용하여 조회할 수 있다.
Member findMember = em.find(Member.class, member.getId());
List<Member> members = findMember.getTeam().getMembers();

for (Member member1 : members) {
    System.out.println("member1 = " + member1);
}

 

연관관계의 주인

  • 이 때, 누가 주인 역할을 하냐. 즉, Team과 Member 둘 다 서로의 값을 참조하고 있다.
  • 이 때 어떤 멤버가 다른 팀을 간다면, 어느 쪽을 수정해야 하나. 둘 다 수정해야 맞다.
  • 이 때 중요한게 연관관계의 주인이다.
  • 주인은 N(외래키를 가지고있는 놈)으로 한다.

 

 

복사했습니다!