[JPA] 영속성 전이와 고아 객체

2025. 4. 15. 01:41·JPA

영속성 전이: CASCADE


엔티티 상태 변경(저장, 삭제 등)을 연관된 엔티티까지 전파하는 설정

 

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때

예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.

 

-Parent

@Entity
public class Parent {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "parent")
    private List<Child> childList = new ArrayList<>();

-Child

@Entity
public class Child {

    @Id
    @GeneratedValue
    private Long id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

-Main

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);
//3번persist말고 부모 persist될때 자식도 자동 persist됐음 좋겠다면?

 

영속성 전이  : 저장

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)

cascade : "이 필드에 들어있는 객체도 같이 저장/삭제/병합 등 해줘^^"

 

-Parent

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

-Main

em.persist(parent);

 

-결과

 

CASCADE - 주의!

  • 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음
  • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 을 제공할 뿐

 

CASCADE의 종류

  • ALL: 모두 적용
  • PERSIST: 영속
  • REMOVE: 삭제
  • MERGE: 병합
  • REFRESH: REFRESH
  • DETACH: DETACH
💡 언제 쓰나용?
단일 소유자 이면서, 라이프 사이클이 같을 때
Ex. 한 부모가 자식을 관리할때. 게시판-첨부파일 게시판에서만 관리한다면 ㅇ, 파일 여러군데에서 관리한다면 x

 

고아 객체


고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제

orphanRemoval = true

 

 

-Parent

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

-Main

 

Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);

em.flush();
em.clear();

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

findParent.getChildList().remove(0);// 자식 엔티티를 컬렉션에서 제거, DB 삭제됨 DELETE FROM CHILD WHERE ID=?

결과

 

주의

  • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능
  • 참조하는 곳이 하나일 때 사용해야함!
  • 특정 엔티티가 개인 소유할 때 사용❗️
  • @OneToOne, @OneToMany만 가능
  • 참고: 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고 아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다. 이것은 CascadeType.REMOVE처럼 동작한다.

 

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


CascadeType.ALL + orphanRemoval=true

 

스스로 생명주기를 관리하는 엔티티는 em을 통해서 em.persist()로 영속화, em.remove()로 제거하는데,

두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있음.

도메인 주도 설계(DDD)의 Aggregate Root개념을 구현할 때 유용

 

'JPA' 카테고리의 다른 글

[JPA] 객체지향 쿼리 언어 - 기본문법  (0) 2025.04.17
[JPA] 값 타입  (0) 2025.04.16
[JPA] 프록시와 지연 로딩 전략  (0) 2025.04.09
[JPA] 고급 매핑(상속)  (0) 2025.04.06
[JPA] 다양한 연관관계 매핑  (0) 2025.04.03
'JPA' 카테고리의 다른 글
  • [JPA] 객체지향 쿼리 언어 - 기본문법
  • [JPA] 값 타입
  • [JPA] 프록시와 지연 로딩 전략
  • [JPA] 고급 매핑(상속)
Naah
Naah
  • Naah
    blueprint
    Naah
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • Java (28)
      • Kotlin (0)
      • TypeScript (7)
      • React (22)
      • Next.js (1)
      • Spring (22)
      • JPA (12)
      • Spring Data JPA (6)
      • Querydsl (1)
      • Error (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • manage
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Naah
[JPA] 영속성 전이와 고아 객체
상단으로

티스토리툴바