JPA
영속성 전이와 고아객체
문승주
2023. 3. 25. 20:04
반응형
영속성 전이(CASCADE)
부모 엔티티의 영속성 상태가 변경될 때, 자식 엔티티의 상태도 함께 변경되도록 자동으로 처리해주는 기능으로 엔티티 간의 연관 관계를 설정할 때 사용한다.
Cascade Type은 다음과 같이 종류가 있습니다.
- ALL: 모든 작업을 전파합니다. (영속화, 병합, 삭제 등)
- PERSIST: 영속화 작업을 전파합니다.
- MERGE: 병합 작업을 전파합니다.
- REMOVE: 삭제 작업을 전파합니다.
- REFRESH: 엔티티를 갱신하는 작업을 전파합니다.
- DETACH: 영속성 컨텍스트에서 분리하는 작업을 전파합니다.
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<>();
// Getter, Setter, Constructor 생략
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
private Parent parent;
// Getter, Setter, Constructor 생략
}
# 영속성 전이 주의
- 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다.
- 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함만 제공한다.
- 자식의 부모엔티티가 하나일 때만 사용하도록 하자.
고아 객체
- 엔티티 간의 연관 관계가 설정되어 있을 때 부모 엔티티와 연관된 자식 엔티티를 자동으로 삭제하는 기능
- 참조하는 곳이 하나일 때 사용!
- 특정 엔티티가 개인 소유일 때 사용
- @OneToOne, @OneToMany만 가능하다.
- CascadeType.REMOVE처럼 동작한다.
@Entity
public class Parent {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Child> children = new ArrayList<>();
// Getter, Setter, Constructor 생략
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
private Parent parent;
// Getter, Setter, Constructor 생략
}
영속성 전이 + 고아 객체, 생명주기 => ( CascadeType.ALL + orphanRemoval=true )
- 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화하고 em.remove()로 제거한다.
- 두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다.
- 도메인 주도 설계(DDD)의 Aggregate Root개념을 구현할 때 유용하다.
반응형