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 |