JPA

[JPA 12] 연관관계 - @ManyToMany

snowkit 2022. 3. 10. 23:47

N:M 관계 (Many-To-Many)

DB의 N:M 관계

  • DB에서 N:M 관계는 2개의 테이블로 구현 불가능하며 중간에 연결 테이블을 사용
    • 학생 테이블
      • 1명의 학생은 N개의 수업을 들을 수 있다
    • 수업 테이블
      • 하나의 수업은 M명의 학생을 가질 수 있다
    • 학생_수업 테이블
      • 학생 테이블과 N:1 관계
      • 수업 테이블과 M:1 관계

객체의 N:M 관계

  • 객체에서 N:M 관계는 Collection을 서로 참조하면 되기 때문에 2개의 객체로 구현 가능

구현

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToMany
    @JoinTable(name = "student_lesson")
    private List<Lesson> lessons = new ArrayList<>();
}
@Entity
public class Lesson {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}
  • student.getLessons().add(lesson)같은 방식으로 쉽게 연결 테이블에 데이터를 넣을 수 있다
  • @ManyToMany는 실무에서 거의 사용되지 않는다
    • 실무에서는 대부분 데이터 생성된 시간, 수정된 시간 등을 저장하고 관리하게 되는데 @ManyToMany를 사용하면 중간의 연결 테이블을 직접 관리할 수 있는 방법이 없다
    • 이 문제를 해결하려면 연결 테이블을 새로운 Entity로 만들고 Student 테이블, Lesson 테이블과 @ManyToOne을 사용해서 각각 N:1 관계를 맺고 사용한다