Zayson
A to Zayson!
Zayson
전체 방문자
오늘
어제
  • 분류 전체보기 (132)
    • Computer Science (20)
      • Network (4)
      • DB (12)
      • OS (4)
    • Algorithm (32)
      • 완전탐색(Brute-Force) (3)
      • 그리디(Greedy) (6)
      • 투포인터(Two-Pointer) (1)
      • 그래프(Graph) (5)
      • BFS & DFS (9)
      • 구현, 시뮬레이션(Implementation) (5)
      • 다이나믹 프로그래밍(DP) (3)
    • Backend (51)
      • Spring Boot (19)
      • JPA (16)
      • Kafka (2)
      • Java (13)
      • Kotlin (1)
    • DevOps (1)
      • Jenkins (5)
      • Oracle Cloud Infrastructure (1)
      • Kubernetes & Docker (1)
    • Trouble Shooting (3)
      • JPA (1)
      • Spring Boot (2)
    • 회고 (5)
      • 엔빵 프로젝트 포스트 로드맵 (1)
      • 2022년 (4)
    • Kafka (7)
      • Kafka (5)
      • Kafka Connect (2)
    • 기술 서적 (6)
      • 데이터 중심 애플리케이션 설계 (3)
      • 개발자가 반드시 정복해야할 객체 지향과 디자인 패턴 (2)
      • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • 구현
  • 라이브스터디
  • BFS
  • Computer science
  • 프로그래머스
  • 관계형 데이터베이스 실전 입문
  • Kafka Connect
  • 그리디
  • JPA
  • CS
  • 나 혼자 스프링부트!
  • 완전탐색
  • Backend
  • Java
  • kafka
  • spring boot
  • 엔빵프로젝트
  • dfs
  • SpringBoot
  • 백준

최근 글

티스토리

hELLO · Designed By 정상우.
Zayson

A to Zayson!

영속성 전이 (Cascade), 고아 객체
Backend/JPA

영속성 전이 (Cascade), 고아 객체

2022. 7. 21. 16:35

영속성 전이(Cascade)

  • 특정 엔티티를 영속 상태로 만들 때 연관 관계에 있는 엔티티도 함께 영속 상태로 만들고 싶은 경우 사용한다.
@Entity
public class Parent {
    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> childList = new ArrayList<>();

        ...
}

@Entity
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);

// Cascade를 사용하는 경우 한번에 영속 상태가 된다.
em.persist(parent);

 

  • 연관 관계 매핑과 관계가 없다.
  • CascadeType.ALL, CascadeType.PERSIST, CascadeType.REMOVE를 주로 사용한다.
  • 소유자가 한개인 경우 사용하는 것을 권장한다. 즉, 단일 엔티티에 대해서 연관 관계 엔티티가 종속적인 경우에 사용한다.
    • 라이프 사이클이 유사할 때 사용한다.
    • 단일 소유자인 경우에 사용한다. (Parent만 Child를 사용, 만약 다른 엔티티인 Member도 Child를 아는 경우 사용하지 않는다.)

 

고아 객체

  • 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 고아 객체라고한다.
// Parent.class
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();

// App
Parent findParent = em.find(Parent.class, parent.getId());

// 첫번재 자식 엔티티의 연관관계를 끊어줌
findParent.getChildList().remove(0); // Delete 쿼리 발생
  • orphanRemoval = true를 설정하면 컬렉션에서 제거되는 엔티티 객체는 Delete 쿼리가 나간다.

 

  • 단일 소유자인 경우 사용한다. 참조가 한 곳에서만 발생하는 경우에 사용한다.
  • 부모 엔티티를 제거하는 경우에 연관관계에 있는 자식 엔티티가 모두 지워지고 그 후에 부모 엔티티가 제거된다. (CascadeType.REMOVE 처럼 사용된다.)
Parent findParent = em.find(Parent.class, parent.getId());
em.remove(parent);  // 부모 엔티티가 삭제되면서 자식 엔티티도 모두 삭제된다. 

 

영속성 전이, 고아 객체 생명 주기

  • 부모 엔티티는 스스로 자신의 라이프 사이클을 관리한다.
  • 부모 엔티티와 연관있는 자식 엔티티는 orphanRemoval = true, CascadeType.ALL을 함께 사용하는 경우 부모 엔티티가 라이프 사이클을 관리할 수 있다.
    • 부모가 생성될 때 persist되면서 자식도 함께 영속 상태가 된다.
    • 부모가 삭제되는 경우 자식도 함께 삭제된다.

 

📄 References

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

반응형
저작자표시 비영리 변경금지 (새창열림)

'Backend > JPA' 카테고리의 다른 글

JPQL 기본  (0) 2022.07.29
값 타입  (0) 2022.07.26
즉시 로딩과 지연 로딩  (0) 2022.07.21
프록시  (0) 2022.07.20
상속관계 매핑  (0) 2022.07.20
    'Backend/JPA' 카테고리의 다른 글
    • JPQL 기본
    • 값 타입
    • 즉시 로딩과 지연 로딩
    • 프록시
    Zayson
    Zayson
    공부한 내용을 정리하는 공간

    티스토리툴바