티스토리 뷰
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다.
JPA는 CASCADE 옵션으로 영속성 전이를 제공한다.
- 쉽게 이해하자면 부모 엔티티를 저장할 때(영속화할 때), 자식 엔티티도 함께 저장할 수 있다.
코드 예제
- 한 부모에 여러 자식이 존재하는 상황으로 다대일(ManyToOne, OneToMany) 관계를 가진다.
// Parent.java
@Entity
public class Parent {
...
@OneToMany(mappedBy = "parent")
private List<Child> children = new ArrayList<Child>();
...
}
// Child.java
@Entity
public class Child {
...
@ManyToOne
private Parent parent;
...
}
이 상황에서 부모 1명에 자식 2명을 저장해야 한다면 아래와 같이 사용해야만 한다.
private static void saveOneParentTwoChild(EntityManager em) {
// 부모 저장
Parent parent = new Parent();
em.persist(parent);
// 자식1 저장
Child child1 = new Child();
child1.setParent(parent); // 부모와 연결
parent.getChildren().add(child1); // 자식과 연결
em.persist(child1);
// 자식2 저장
Child child2 = new Child();
child2.setParent(parent); // 부모와 연결
parent.getChildren().add(child2); // 자식과 연결
em.persist(child2);
}
- 부모 1명, 자식 2명을 다 저장해야하므로 JPA에서 저장할 엔티티를 모두 영속상태로 만들어주어야 한다. 즉, 위와 같이 1개의 부모 엔티티와 2개의 자식 엔티티를 다 수동으로 영속상태로 바꿔주어야 한다.
- 위 상황에서 CASCADE 영속성 전이를 사용하면, 부모의 영속 상태 전환을 통해 연관된 자식까지 한 번에 영속 상태로 전환시킬 수 있다.
영속화 전이 사용
// Parent.java
@Entity
public class Parent {
...
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<Child>();
...
}
부모 영속화 시, 자식도 영속화할 수 있도록 영속화 전이 속성인 CASCADE를 설정하였다.
- 특히, 영속화(persist)할 때만 전이 속성이 적용되도록 CascadeType.PERSIST 를 사용하였다.
영속화 전이를 사용했을 때의 저장 코드를 살펴보자.
private static void saveOneParentTwoChild(EntityManager em) {
Child child1 = new Child();
Child child2 = new Child();
// 부모 저장
Parent parent = new Parent();
child1.setParent(parent); // 부모와 연결
child2.setParent(parent); // 부모와 연결
parent.getChildren().add(child1); // 자식과 연결
parent.getChildren().add(child2); // 자식과 연결
// CASCADE 속성을 통해 부모를 영속화하는 것으로 자식도 영속화 된다
em.persist(parent);
}
- CASCADE 가 설정되어있기에 부모를 영속화 함에 따라 연결된 자식들도 자동으로 함께 영속화 된다.
- 이를 통해 코드가 매우 간결해지고, 연결된 자식을 영속화 하지 않는 오류(무결성 예외가 발생할 수 있는)를 줄일 수 있게 되었다.
영속화 전이 종류
위 예제에선 영속화 될 때 전이되는 CascadeType.PERSIST 만 보았는데, 더 많은 종류가 존재한다.
public enum CascadeType {
ALL, // 아래 모든 경우, 전이
PERSIST, // 영속화 할 때, 전이
MERGE, // 병합 할 때, 전이
REMOVE, // 삭제 할 때, 전이
REFRESH, // 새로고침할 때, 전이
DETACH; // 부모 엔티티가 detach 호출 시, 자식도 detach 전이
}
- 만약 ALL 이 아닌 여러 개의 영속화 전이를 사용하고 싶은 경우엔 {} 로 묶어주면 된다.
- @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.REMOVE })
추가적으로 알아두어야 하는 것이 전이(CASCADE)는 EntityManager를 통해 persist, remove 메서드를 호출할 때 일어나는 것이 아니라 flush가 호출될 때 일어난다는 것이다.
320x100
반응형
'Development > Java, Kotlin, Frameworks' 카테고리의 다른 글
Java Proxy 설정 가이드 (0) | 2021.09.10 |
---|---|
Spring boot - access log (0) | 2021.08.21 |
Java vm -Xmx -Xms option (2) | 2021.06.30 |
[Spring Boot] Container image 만들기 ! (0) | 2021.06.24 |
Maven Profile 설정 (0) | 2021.06.04 |
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- docker
- 일상
- WebFlux
- Kubernetes
- gradle
- 클린 아키텍처
- boj
- java
- MySQL
- 알고리즘
- 로그
- container
- Intellij
- jasync
- 백준
- python
- Istio
- Clean Architecture
- 하루
- Spring
- Log
- c++
- hexagonal architecture
- Algorithm
- tag
- 비동기
- Spring boot
- 쿠버네티스
- HTTP
- k8s
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함