JPA 영속성 전이와 고아 객체

JooHeon·2021년 11월 15일
0
post-custom-banner

❔ 영속성 전이(CASCADE)

  • Entity를 영속 시킬 때 연관 Entity도 자동으로 같이 넣어주는 기능

🖊 언제 쓸까?

  • 부모 Entity를 영속 상태로 만들 때 연관된 Entity도 함께 영속 상태로 만들고 싶을 때
    (단순 편리함 제공)
  • 연관된 Entity의 생명주기를 부모 Entity가 관리하므로 DAO가 필요없다.(DDD 설계에 유용)

🖊 예제 코드

@ManyToOne
@JoinColumn(name = Parent_Id)
Parent parent;
// @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) // ALL이나 PERSIST 사용
@OneToMany(mappedBy = "parent")
List<Child> childs = new ArrayList<>();
	...
em.persist(parent);
em.persist(child1); // cascade시 지워도 된다.
em.persist(child2); // cascade시 지워도 된다.
   ...

❗ 주의점

  • Child Entity를 다른 Entity에서도 사용한다면 운영상의 문제로 사용을 권장하지 않는다.
    (완전히 Parent에 종속적일 경우에만 사용)
  • cascade type이 DELETE라면 부모를 제거하는 경우 관련된 Entity도 모두 삭제된다.

❔ 고아 객체

  • 부모와 끊어진 연관 Entity

🖊 고아 객체 제거

orphanRemoval을 true로 하면 고아 객체가 자동적으로 DB에서 DELETE 된다.

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
List<Child> childs = new ArrayList<>();
	...
Parent findParent = em.find(Parent.Class, parent.getId());
parent.getChilds().remove(0) // List 컬렉션의 0번 child 제거
// DELETE 쿼리가 나간다
   	...

❗ 주의점

  • 영속성 전이의 주의점과 동일하다.
  • 부모가 제거되면 연관 Entity는 모두 DB에서 지워진다.(쿼리 N개)
    (orphanRemoval이 false인 상태에서는 FK 제약 조건으로 부모가 제거되지 않는다)
post-custom-banner

0개의 댓글