[JPA] 엔티티 상태, Cascade, 고아객체 제거

Harry park·2022년 6월 23일
0

JPA

목록 보기
7/8
post-thumbnail

Entity 상태

Entity의 상태는 크게 4가지로 나뉜다.

Entity 상태 종류

  1. Transient
    JPA가 Entity를 나타내는 객체에 대한 정보를 아무것도 모르는 상태
    DB와 매핑된 것이 아무것도 없는 상태를 말한다.
  2. Persistent
    JPA가 Entity를 관리(영속)중인 상태이다.
  3. Detached
    JPA가 더이상 관리하지 않는 상태이다.
  4. Removed
    JPA가 관리하는 상태에서, 해당 Entity를 삭제 하기로 한 상태이다.


Cascade

CascadeEntity의 상태를 전이시키는 것이다.

Cascade 종류 및 적용

  1. ALL
    아래 속성 모두 적용
  2. PERSIST
    저장(영속)
@Entity
public class Category {
    ...
    @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
    private List<Category> children = new ArrayList<>();
    ...
}

아래 처럼 parent를 영속홯하면 자식 엔티티까지 함께 영속화되어 저장한다.

public static void save(EntityManager em) {

    Category child1 = new Category();
    Category child2 = new Category();

    Category parent = new Category();
    child1.setParent(parent);
    child2.setParent(parent);
    parent.getChildren().add(child1);
    parent.getChildren().add(child2);

    em.persist(parent); // 영속화
}
  1. MERGE
    병합
  2. REMOVE
    삭제
@Entity
public class Category {
    ...
    @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
    private List<Category> children = new ArrayList<>();
    ...
}
public static void save(EntityManager em) {

    Category parent = em.find(Category.class, 1L);
    em.remove(parent); // 영속화
}

연관된 자식 엔티티도 함께 삭제된다.

  1. REFRESH
  2. DETACH

고아객체(OrphanRemoval)

JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데 이를 고아 객체 제거라 한다.

고아객체 사용 방법

OrphanRemoval 속성을 자식엔티티에서 true로 지정한다.
( 주로 OneToMany 에서 사용한다.)
부모엔티티에서 자식엔티티의 생성주기를 관리 할 수 있게 해주는 기능!!


참고사이트

tistory - engkimbs님 블로그


개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍

profile
Jr. Backend Engineer

0개의 댓글