티스토리 뷰

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 영속성 전이 기능을 사용하면 된다.

 

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
링크
«   2024/11   »
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
글 보관함