프로그래밍/Spring
[ JPA ] CASCADE는 어디에 사용할까 (persist 한 번만 쓰고 싶을 때)
Yanoo
2022. 1. 22. 11:35
728x90
반응형
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent")
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) {
childList.add(child);
child.setParent(this);
}
// .. 이하 생략
}
import javax.persistence.*;
@Entity
public class Child {
@Id @GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
public Parent getParent() {
return parent;
}
// .. 이하 생략
}
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
예를 들어서 1:N 관계를 가지는 이런 코드가 있다고 하자.
parent, child1, child2를 모두 영속성 컨텍스트에 넣기 위해선
em.persist(child1);
em.persist(child2);
em.persist(parent);
이런 코드가 필요할 것이다.
하지만 이렇게 모두를 persist 하지 않아도 되는데 그 때 쓰이는게 CASCADE이다.
PARENT에
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
CASCADE를 ALL로 설정해준다.
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
이렇게 실행을 하면,
child까지 쿼리문이 들어간 것을 확인할 수 있다.
하지만 주의할 점이 있는데, 그것은 다른 엔티티가 관계에 연관되어서는 안된다는 점이다. 오로지 CHILD와 PARENT사이만 존재할 때 사용해야 한다고 한다.
728x90
반응형