CASCADE
- ALL : 모두 적용
- PERSIST : 영속
- REMOVE : 삭제
- MERGE : 병합
- REFRESH : refresh
- DETACH : DETACH
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
em.persist(child1);
em.persist(child2);
위 처럼 코드를 작성하면 parent, child1/2가 잘 들어감 근데 만약 persist를 세번 안하고 parent를 persist 하는 동시에 child 까지 동시에 넣고 싶다면?? → CASCADE 사용!!
/* Parent.java */
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
/* Main.java */
em.persist
실무에서 사용 시 부모가 자식의 유일한 소유자, 즉 하나의 부모와만 연관관계가 있다면 사용!
→ 게시판에서 하나의 게시글에서만 사용되는 첨부파일은 사용해도 괜찮다.
but 이 첨부파일이 다른데서도 사용되면 CASCADE 사용 X
고아객체
- parent에 orphanRemoval = true로 지정해 주면 parent 밖으로 나가는 데이터는 아예 삭제된다.
Parent findParent = em.find(Parent.class, parent.getId());
findParent.getChildList().remove(0);
그럼 만약 parent를 삭제하면? → 당연히 자식까지 삭제됨
- child는 생명주기를 parent가 관리
- 스스로 생명 주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거
- 두 옵션을 모두 활성화 하면 부모 엔티티를 통해 자식의 생명 주기 관리
- DDD(도메인 주도 설계) 의 Aggregate Root 개념을 구현 할 때 유용
'JAVA' 카테고리의 다른 글
[JAVA] 값 타입과 불변객체 (0) | 2022.01.11 |
---|---|
[JAVA] 임베디드 타입(복합값) (0) | 2022.01.11 |
[JAVA] 즉시로딩과 지연로딩 (0) | 2022.01.05 |
[JAVA] 프록시 (0) | 2022.01.04 |
[JAVA] @MappedSuperclass (0) | 2022.01.04 |