반응형
고아 객체 제거
JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데 이것을 고아 객체(ORPHAN) 제거라 한다.
이 기능을 사용해서 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제한다.
@Entiry
public class Parent {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> childs;
}
Parent parent = em.find(Parent.class, id);
parent.getChilds().remove(0); // 실제 데이터베이스에서 삭제
orphanRemoval = true로 설정하면 고아 객체 제거 기능이 활성화 된다.
다른 SQL과 마찬가지로 플러시 시점에 DELETE SQL이 실행된다.
고아 객체 제거는 참조가 제거된 엔티티는 다른 곳에서 참조되지 않고 사용되지 않을때 삭제하는 기능이다.
만약 다른곳에서 참조되고 있는제 고아 객체를 제거해버리면 프로그램상 오류가 발생할 수 있다.
고아 객체 제거는 CasecadeType.REMOVE을 설정한 기능과 같다. (참조: https://devbksheen.tistory.com/200)
부모가 삭제되면 참조가 끊어져 고아 객체가 되고 자식도 함께 삭제 된다.
영속성 전이 + 고아 객체, 생명주기
CasecadeType.ALL + orphanRemoval = true를 동시에 사용하면 부모 엔티티를 통해서 자식 엔티티의 생명 주기를 관리할 수 있다.
Parent parent = em.find(Parent.class, parentId);
// 자식을 저장하려면 부모에 등록만 하면된다.
parent.addChild(child);
// 자식을 삭제하려면 부모에서 제거하면 된다.
parent.getChilds().remove(removeObject);
반응형
'JPA' 카테고리의 다른 글
객체 지향 쿼리 소개(JPQL, Criteria, Native, QueryDSL) (0) | 2022.01.13 |
---|---|
엔티티(Entity)와 값 타입(Value Type) (2) | 2022.01.13 |
영속성 전이: CASCADE (0) | 2022.01.10 |
프록시를 사용한 즉시(Eager), 지연(Lazy) 로딩 매핑 (0) | 2022.01.06 |
조인 테이블 매핑 (0) | 2022.01.05 |