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개념을 구현할 때 유용하다.

반응형