-
영속성 전이(CASCADE)JPA/JPA 기본 2023. 7. 11. 18:05
영속성 전이 : 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때
Parent class
@Entity @Getter @Setter 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); } }
Child class
@Entity @Getter @Setter public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn(name = "parent_id") private Parent parent; }
Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.persist(child1); em.persist(child2);
parent에 child1과 chlid2가 있을 때 persist하려면 각각 한 번씩 해서 총 3번을 해야한다.
이 때 persist를 한 번으로 줄여주는 것이 cascade이다.
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List<Child> childList = new ArrayList<>();
Parent 클래스에 있는 childList 변수의 연관관계 매핑 뒤에 cascade = CascadeType.ALL을 추가하면 된다.
이렇게 된다면 em.persist(parent)만 하더라도 child1과 chlid2 둘 다 한 번에 persist가 되기 때문에 각각 3번 persist를 하지 않아도 된다.
영속성 전이는 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이지 연관관계를 매핑하는 것과 아무 관련이 없다.
무작정 쓰면 안되고 하나의 부모가 자식들을 관리할 때에만 쓰는 것이 좋다. 자식 클래스가 부모를 위해서만 존재할 때만 의미가 있다. 예를 들어서 주문목록과 주문같은 관계이다. 주문목록은 주문을 위해서만 존재하는 엔티티이기 때문이다.
만약에 주문목록이 다른 엔티티와도 연관관계가 있다면 사용하지 않는 편이 좋다.
1. 라이프 사이클이 유사할 때
2. 소유자가 하나뿐일 때
위의 2가지 상황에 충족할 때에만 영속성 전이를 사용하는 것이 좋다.