Engineering Note

[JPA] 고아객체 본문

Server/JPA ORM

[JPA] 고아객체

Software Engineer Kim 2026. 2. 6. 19:21

고아 객체

JPA에서 부모 엔티티와 연관관계가 끊어진 자식 엔티티. 

참조가 제거된 엔티티

 

고아 객체 제거

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능. 

또는 부모가 제거되면 자식이 제거되는 기능(부모를 제거하면 자식은 참조가 끊기기 때문. CascadeType.REMOVE 설정과 같은 역할을 함.)

이 기능을 사용하면 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거할 때 자식엔티티가 삭제된다.

참조하는 곳이 하나일 때만 사용할 수 있다. => @OneToOne, @OneToMany에만 사용할 수 있다.

 

 

 

//예제 8.19 고아 객체 제거 기능 설정

@Entity
public class Parent {

 @Id @GeneratedValue
 private Long id;
 
 @OneToMany(mappedBy = "parent", orphanRemoval = true)
 private List<Child> children = new ArrayList<Child>();

}

 

연관관계 제거를 통해 고아객체 제거 기능 수행

Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거


//실행된 SQL 결과
DELETE FROM CHILD WHERE ID=?

 

컬렉션에서 첫 번째 자식을 제거했고, orphanRemoval = true 옵션으로 컬렉션에서 엔티티를 제거하면 데이터베이스의 데이터도 삭제된다. 고아 객체 제거 기능은 영속성 컨텍스트를 플러시할 때 적용되므로 플러시 시점에 DELETE SQL이 실행된다.

 

모든 자식 엔티티를 제거하려면 다음 코드 처럼 컬렉션을 비우면 된다.

parent1.getChildren().clear();

 

 

참고자료 : JPA 프로그래밍(김영한)

 

Comments