JPA

고아 객체(feat. orphanRemoval)

쿠카이든 2022. 6. 12. 00:32
728x90
  • JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데 이것을 고아 객체(ORPHAN) 제거라 한다.
  • 이 기능을 사용해서 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제된다.
@Entity
public class Parent {

    @Id @GeneratedValue
    private Long id;
    
    @OneToMany(mappedBy = "parent", orphanRemoval = true)
    private List<Child> children = new ArrayList<Child>();
    ...
}
  • 위 코드와 같이 orphanRemoval = true로 설정하면, 컬렉션에서 제거한 엔티티는 자동으로 삭제된다.
Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0);	//자식 엔티티를 컬렉션에서 제거
  • 실행 결과 SQL은 다음과 같다.
DELETE FROM CHILD WHERE ID=?
  • 사용 코드를 보면 컬렉션에서 첫 번째 자식을 제거했다. orphanRemoval = true 옵션으로 인해 컬렉션에서 엔티티를 제거하면 데이터베이스의 데이터도 삭제된다.
  • 만약, 모든 자식 엔티티를 제거하려면 다음 코드처럼 컬렉션을 비우면 된다.
parent1.getChildren().clear();

 

출처 : JPA 프로그래밍 (저자 김영한)

728x90