BE/Spring & Spring Boot

[Spring Boot] @ManyToOne, @OneToMany

baek-dev 2024. 12. 22. 11:04

JPA 에서 사용하는 관계 매핑 어노테이션.

데이터베이스 테이블간의 연관 관계를 자바 객체로 표현할때 사용.


@ManyToOne (다대일 관계)

의미

  • 여러개의 엔티티가 하나의 엔티티에 연결된 관계
  • ex) 여러명의 학생이 하나의 학급에 소속되는 경우

예제

@Entity
public class Student {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "class_id") // 외래 키를 매핑
    private ClassRoom classRoom; // 한 명의 학생은 하나의 학급에 소속
}
  • 다대일 관계를 나타냄
  • JoinColumn은 외래키를 매핑하는데 사용, 위 예제에서는 class_id가 외래키로 사용됨

속성

1. fetch

  • 연관데이터를 가져오는 방식을 설정한다
  • 기본값 : Eager
    • Eager
    • Lazy

2. cascade

  • 부모 엔티티에 수행된 작업(저장,삭제 등)을 연관된 자식 엔티티에 전파할지 설정
    • CascadeType.PERSIST : 부모 엔티티 저장시, 자식 엔티티도 저장
    • ".MERGE : 부모 엔티티 병합시, 자식 엔티티도 병합
    • ".REMOVE : 부모 엔티티 삭제시, 자식 엔티티도 삭제
    • ".ALL : 모든 작업을 전파
    • ".DETACH : 부모와 자식간의 영속성 컨텍스트 분리
    • ".REFRESH : 부모 엔티티를 다시읽을때, 자식도 새로고침

3. optional

  • 연관된 엔티티가 null이어도 되는지 여부를 설정
  • 기본값 : true
    • true : 연관된 엔티티가 없어도 무방
    • false : 연관된 엔티티가 반드시 있어야 함
@ManyToOne(optional = false) // 반드시 ClassRoom이 있어야 함
private ClassRoom classRoom;

4. targetEntity

  • 연관된 엔티티의 클래스타입을 명시적으로 지정
  • 기본값 : 자동으로 연관된 필드의 타입을 인식
@ManyToOne(targetEntity = ClassRoom.class)
private ClassRoom classRoom;

@OneToMany (일대다 관계)

의미

  • 하나의 엔티티가 여러개의 다른 엔티티와 연결된 관계
  • ex) 하나의 학급에 여러며의 학생이 소속되는 경우

예제

@Entity
public class ClassRoom {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "classRoom") // Student의 classRoom 필드와 매핑
    private List<Student> students; // 한 학급에는 여러 명의 학생이 있음
}
  • 일대다 관계를 나타냄
  • mappedBy 는 연관관계의 주인을 설정하는데 사용되며, 해당 필드는 외래키를 소유하지 않음
    • 여기서 students리스트는 Student 엔티티의 classRoom필드와 매핑된다

속성

 

1. fetch

2. cascade

3. mappedBy

  • 양방향 연관관계에서 주인을 설정
  • 필수 : onetomany는 항상 반대쪽의 필드이름을 지정해야함
@OneToMany(mappedBy = "classRoom") // Student의 classRoom 필드가 주인
private List<Student> students;

4. orphanRemoval

  • 부모와 연관관계가 끊어진 고아객체를 자동으로 삭제할지 설정
  • 기본값 : false
    • true : 관계가 끊어지면 데이터베이스에서 삭제
    • false : 고아 객체를 그대로 둠
@OneToMany(orphanRemoval = true)
private List<Student> students;

속성 이름 적용가능 어노테이션 설명 기본값
fetch @ManyToOne, @OneToMany 데이터 로딩 방식 (즉시 로딩 / 지연 로딩) @ManyToOne: EAGER, @OneToMany: LAZY
cascade @ManyToOne, @OneToMany 부모-자식 작업 전파 설정 없음
optional @ManyToOne 연관 엔티티가 필수인지 여부 true
mappedBy @OneToMany  양방향 관계에서 주인 설정 필수
orphanRemoval @OneToMany 고아 객체를 자동으로 삭제할지 여부 false
targetEntity @ManyToOne, @OneToMany 연관 엔티티 타입 명시 자동 감지

 


ManyToOne , OneToMany 관계의 연결

양방향 관계를 구성할 수 있다

@Entity
public class Student {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "class_id") // 외래 키
    private ClassRoom classRoom; // 한 명의 학생은 하나의 학급에 소속
}

@Entity
public class ClassRoom {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "classRoom") // Student의 classRoom 필드와 매핑
    private List<Student> students; // 한 학급에는 여러 명의 학생이 있음
}

실제 데이터베이스에서의 표현

ManyToOne

  • Student 테이블에는 class_id라는 외래키 컬럼이 생성된다

OneToMany

  • 데이터베이스에서 외래키는 Student테이블에 있지만 JPA에서 이를 ClassRoom객체와 매핑한다

 

양쪽에 관계를 설정할때 한쪽을 주인(mappedBy)으로 지정해야함

 

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot, JPA] 스냅샷  (1) 2024.12.25
[Spring Boot, JPA] 영속성 컨텍스트  (0) 2024.12.24
[Spring Boot] Eager, Lazy  (0) 2024.12.21
[Spring Boot] IoC 컨테이너  (2) 2024.12.21
[Spring Boot] 빈이란  (1) 2024.12.15