JAVA

[JAVA] 영속성 전이(CASCADE) + 고아객체

응디 2022. 1. 6. 17:46

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