부모 엔티티: 하나 이상의 자식 엔티티를 소유하는 쪽 (@OneToMany 관계)
자식 엔티티: 부모 엔티티에 속해 있으며, 반드시 부모를 참조 (@ManyToOne 관계)
public class Lecture {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "lecture", cascade = CascadeType.ALL, orphanRemoval = true)
private List<LectureTime> lectureTimes = new ArrayList<>();
public void addLectureTime(LectureTime lectureTime){
lectureTimes.add(lectureTime);
lectureTime.setLecture(this); //부모자식 관계 설정 중요
}
public void removeLectureTime(LectureTime lectureTime) {
lectureTimes.remove(lectureTime);
lectureTime.setLecture(null); // 관계 해제
}
}
@OneToMany(mappedBy = "lecture")
LectureTime 엔티티에서 lecture 필드와 연결됨 (양방향 관계)
cascade = CascadeType.ALL
부모(Lecture)를 저장하면 자식(LectureTime)도 자동 저장됨
부모를 삭제하면 자식도 자동 삭제됨
orphanRemoval = true
부모 엔티티에서 자식엔티티를 제거할때 DB에서 자동으로 DELETE실행
orphanRemoval = false 이면
명시적으로 delete를 호출해서 db에서 지워줘야함
mappedBy = "lecture" mappedBy는 연관관계 주인이 아닌쪽에 설정되고 반대쪽 "lecture" 필드가 주인(외래키)이다.
속성은 DB에 데이터 저장과 삭제에 연관관계가있고 메모리에 데이터에도 똑같이 적용되도록 setLectureTime, removeLectureTime 와 같이 메서드로 연관관계를 명확하게 설정해야한다
public class LectureTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String time;
@ManyToOne //자식관계
@JoinColumn(name = "lecture_id", nullable = false) //FK 설정
}
public void setLecture(Lecture lecture) {
this.lecture = lecture;
} // 양방향 참조
@ManyToOne
LectureTime이 Lecture에 속함 (자식이 부모를 참조)
@JoinColumn(name = "lecture_id")
lecture_id 컬럼을 통해 Lecture와 연결됨
setLecture()
LectureTime이 Lecture를 참조하도록 설정