728x90
고아 객체
- JPA에서 부모와 연관관계가 끊어진 자식엔티티를 고아 객체라 하며
- JPA에서는 orphanRemoval 옵션을 통해서 고아객체를 자동으로 삭제하는 기능을 제공함
orphanRemoval 옵션
@Entity
@Getter
@Setter
public class Parent {
@Id
@GeneratedValue
@Column(name = "parent_id")
private Long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Child> childs = new ArrayList<>();
public void addChild(Child child) {
this.childs.add(child);
child.setParent(this);
}
}
@Entity
@Getter
@Setter
public class Child {
@Id
@GeneratedValue
@Column(name = "child_id")
private Long id;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
}
- orphanRemoval 옵션이 true가 되면 부모엔티티에서 자식 엔티티를 제거할 경우 delete 쿼리가 발생 (바로 실행되지 않고 플러시할 때 적용할 경우 삭제쿼리가 실행)
- 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아객체로 보고 삭제하게 됨, 참조하는 객체가 여러개라면 문제가 발생할 수 있기 때문에 일대일이나, 일대다 관계일 경우에 사용이 가능
Cascade Remove와 orphanRemoval 옵션
- CascadeTypo.ALL (Remove 포함) + orphanRemoval=true
- 두 옵션을 모두 활성화 할 경우 부모엔티티를 통해서 자식 엔티티의 생명주기를 관리할 수 있음
- 도메인 주도 설계의 Aggregate Root 개념을 구현시 유용함
'SPRING' 카테고리의 다른 글
[SPRING] MOCKITO (0) | 2022.07.03 |
---|---|
[SPRING] JPA 영속성 전이 (0) | 2022.06.06 |
[SPRING] WEBFLUX 리액티브 오퍼레이션 정리 (0) | 2022.05.08 |
[SPRING] JPA 쿼리메소드 요약 (0) | 2022.04.19 |
[SPRING] Bean 생명주기 콜백 (PostConstruct / PreDestory) (0) | 2022.03.02 |