JPA @OneToMany 매핑

최형안·2025년 2월 18일

JPA @OneToMany 매핑

부모 엔티티: 하나 이상의 자식 엔티티를 소유하는 쪽 (@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를 참조하도록 설정

0개의 댓글