JPA
8.4 영속성 전이: CASCADE
fmoths
2021. 1. 16. 22:49
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다.
JPA는 CASCADE 옵션으로 영속성 전이를 제공한다. 쉽게 말해서 영속성 전이를 사용하면 부모 엔티티를 저장할 때, 자식 엔티티도 함께 저장할 수 있다.
- 부모 엔티티
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent")
private List<Child> children = new ArrayList<Child>();
}
- 자식 엔티티
@Entity
public class Child{
@Id @GeneratedValue
private Long id;
@ManyToOne
private Parent parent;
}
- JPA에서 엔티티를 저장할 때, 연관된 모든 엔티티는 영속상태여야 한다.
8.4.1 영속성 전이: 저장
@Entity
public class Parent{
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<Child>();
}
부모만 영속화하면 CascaseType.PERSIST로 설정한 자식 엔티티까지 함께 영속화해서 저장한다.
영속성 전이는 연관관계를 매핑하는 것과는 아무 관련이 없다. 단지 엔티티를 영속화할때, 연관된 엔티티도 같이 영속화하는 편리함을 제공할 뿐이다.
8.4.2 영속성 전이: 삭제
영속성 전이는 엔티티를 삭제 할때도 사용할 수 있다. CascaseType.REMOVE로 설정하고 다음 코드처럼 부모 엔티티만 삭제하면 자식엔티티도 함께 삭제된다.
Parent findParent = em.find(Parent.class, 1L);
em.remove();
삭제 순서는 외래 키 제약조건을 고려해서 자식을 먼저 삭제하고 부모도 삭제한다.
8.4.3 CASCADE의 종류
public enum CascadeType {
ALL, //모두적용
PERSIST, //영속
MERGE, //병합
REMOVE, //삭제
REFRESH, //REFRESH
DETACH //DETACH
다음처럼 여러 속성을 같이 사용할 수 있다.
cascade = {CascadeType.PERSIST, CascaseType.REMOVE}
참고로 CascadeType.PERSIST, CascadeType.REMOVE는 em.persist(), em.remove()를 실행할 때 바로 전이가 발생하지 않고 플러시를 호출할 때 전이가 발생한다.