프로그래밍/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
반응형