영속성 전이는 코드로 이해하는 것이 가장 빠른 듯 하다.
Before: em.persist()를 3번 해줘야 한다.
Child child1 = new Child();
Child child2 = new Child();
// 위의 두 Child객체를 가지는 Parent객체
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
em.persist(child1);
em.persist(child2);
After: em.persist()를 한번만 해도 된다.
Child child1 = new Child();
Child child2 = new Child();
// 위의 두 Child객체를 가지는 Parent객체
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
차이점은 Parent 객체에서 Child의 List에 영속성 전이 설정 여부이다.
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
List<Child> childs = new ArrayList<>();
영속성 전이에 대한 설정인 cascade를 넣게 되면 Parent(부모)만 persist해도 해당 Parent내 리스트의 Child(자식)객체들까지 한번에 insert 시켜주는 형태이다.
CASCADE
연관관계를 매핑하는 것과는 아무 관련이 없다.
연관된 엔티티도 함께 영속화해주는 편리함만 제공한다.
CASCADE의 종류
ALL: 모두 적용
PERSIST: 영속
REMOVE: 삭제
MERGE: 병합
REFRESH: REFRESH
DETACH: DETACH
고아 객체
- 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제해준다.
- orphanRemoval = true 설정으로 적용할 수 있다.
- Parent 객체가 삭제됐을 때 그 안에 있던 List<Child>내의 Child객체들을 전부 DELETE해준다.
- CASCADE의 REMOVE와 같은 기능을 수행한다.
- 참조하는 곳이 하나일 때만 사용할 것. 즉, 특정 엔티티가 개인 소유하고 있을 때만 사용해야 한다.
- 여러 객체가 연관되어 있으면 사용하면 안된다.
- 한 곳에서 참조하지 않는다고 객체들을 전부 DELETE해버리면 다른 곳에서의 참조는 덩그러니 남기 때문이다.
'Spring > 이론' 카테고리의 다른 글
JPA - 값 타입 (0) | 2023.07.07 |
---|---|
Spring Security 동작 원리 / 필터 순서 (0) | 2023.07.05 |
JPA 기본 - 지연 로딩 즉시 로딩 (0) | 2023.06.28 |
JPA 기본 - 프록시 객체 (0) | 2023.06.28 |
웹 애플리케이션 이해 (0) | 2022.07.14 |