Entity
의 상태는 크게 4가지로 나뉜다.
Transient
Entity
를 나타내는 객체
에 대한 정보를 아무것도 모르는 상태DB
와 매핑된 것이 아무것도 없는 상태를 말한다.Persistent
Entity
를 관리(영속)중인 상태이다.Detached
Removed
Entity
를 삭제 하기로 한 상태이다.Cascade
는 Entity
의 상태를 전이시키는 것이다.
ALL
PERSIST
@Entity
public class Category {
...
@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private List<Category> children = new ArrayList<>();
...
}
아래 처럼 parent
를 영속홯하면 자식 엔티티까지 함께 영속화되어 저장한다.
public static void save(EntityManager em) {
Category child1 = new Category();
Category child2 = new Category();
Category parent = new Category();
child1.setParent(parent);
child2.setParent(parent);
parent.getChildren().add(child1);
parent.getChildren().add(child2);
em.persist(parent); // 영속화
}
MERGE
REMOVE
@Entity
public class Category {
...
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private List<Category> children = new ArrayList<>();
...
}
public static void save(EntityManager em) {
Category parent = em.find(Category.class, 1L);
em.remove(parent); // 영속화
}
연관된 자식 엔티티도 함께 삭제된다.
REFRESH
DETACH
JPA는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공하는데 이를 고아 객체 제거
라 한다.
OrphanRemoval
속성을 자식엔티티에서 true
로 지정한다.
( 주로 OneToMany 에서 사용한다.)
부모엔티티에서 자식엔티티의 생성주기를 관리 할 수 있게 해주는 기능!!
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍