N:M 관계 (Many-To-Many)
DB의 N:M 관계
- DB에서 N:M 관계는 2개의 테이블로 구현 불가능하며 중간에 연결 테이블을 사용
- 학생 테이블
- 수업 테이블
- 학생_수업 테이블
- 학생 테이블과 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 관계를 맺고 사용한다