Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

영속성 전이(CASCADE),고아 객체 본문

인프런/[인프런] 자바ORM 표준 JPA 프로그래밍

영속성 전이(CASCADE),고아 객체

Seung__ 2021. 8. 12. 21:35

1. 영속성 전이  : CASCADE


  • 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용
  • 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.

  • CASCADE를 사용하지 않으면 일일히 저장해 줘야한다.
    • Child와 Parent는 양방향 다대일 관계
  • 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);
    
    tx.commit();
  • 흠 귀찮은데?
  • 요 때 쓰는게 CASCADE
  • Parent class
public class Parent {

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Child> childList = new ArrayList<>();
  • parent만 persist 해보자.
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);

tx.commit();
  • Parent만 persist했는데, Child의 INSERT SQL도 나간다!!!! ㄱㅇㄷ
Hibernate: 
    /* insert hellojpa.Parent
        */ insert 
        into
            Parent
            (name, PARENT_ID) 
        values
            (?, ?)

Hibernate: 
    /* insert hellojpa.Child
        */ insert 
        into
            Child
            (name, PRAENT_ID, id) 
        values
            (?, ?, ?)

Hibernate: 
    /* insert hellojpa.Child
        */ insert 
        into
            Child
            (name, PRAENT_ID, id) 
        values
            (?, ?, ?)

 

 

2. CASCADE 주의사항


  • 영속성 전이는 연관관계를 매핑하는 것과 관련이 없어!
  • 엔티티를 영속화 할 대 연관된 엔티티도 함게 영속화하는 편리함을 제공할 뿐임

 

3. CASCADE 종류


ALL 모두 적용
PERSIST 영속
REMOVE 삭제
MERGE 병합
REFRESH REFRESH
DETACH DETACH

 

 

4. 언제써??


  • 게시판이랑, 첨부파일의 경로???? 관계에서 사용이 가능
  • 첨부파일 경로는 "한" 게시물에서만 관리됨.요런 경우 사용 가능
  • 즉, CHILD가 여러 곳과 연관관계가 있는 경우는 사용하면 안됨.
  • 즉, 라이프 사이클이 거의 같을 경우, 소유자가 하나일 경우에만 사용.

 

5. 고아객체(orphanRemoval)


  • 고아객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제.
  • orphanRemoval = true
  • Parent parent1 = em.find(Parent.class, id); 
    parent1.getChildren().remove(0);
    //자식 엔티티를 컬렉션에서 제거
  • 부모에서 자식엔티티 없애버림.
  • ? 자식입장에서 부모없음 ㅜ
  • 예) 첫째는 호적에서 파버리자
  • @Entity
    public class Parent {
    
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> childList = new ArrayList<>();
  • Child child1  = new Child();
    Child child2  = new Child();
    
    Parent parent = new Parent();
    parent.addChild(child1);
    parent.addChild(child2);
    
    em.persist(parent);
    
    em.flush();
    em.clear();
    
    Parent findParent = em.find(Parent.class, parent.getId());
    findParent.getChildList().remove(0);
    
    tx.commit();
  • 첫째가 제거되었다... 

6. 고아객체 주의, 사용 조건


  • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능.
  • 참조하는 곳이 하나일 때 사용해야해. 당연!
  • 특정 엔티티가 개인 소유할 때 사용
  • 즉, @OneToOne, @OneToMany에서만 사용 가능
  • 참고로 개념적으로 부모를 제거하면 자식은 고아가 됨.
    따라서 고아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다.
    어? CascadeType.REMOVE랑 비슷하다.

 

7. 영속성 전이 + 고아 객체, 생명주기


  • CASCADE랑 orphanRemoval = true 둘 다 적용하면??
  • 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거.
  • 두 옵션을 모두 활성화 하면, 부모 엔티티를 통해서 자식의 생명 주기를 관리 가능.
  • 즉, parent의 생명 주기는 JPA를 통해 관리되나
  • Child의 생명주기는 Parent에 의해 관리된다.
  • 도메인 주도 설계(DDD)의 Aggregate Root개념을 구현할 때 유용함.

 

8. GitHub : 210812 CASCADE, orphanRemoval


 

GitHub - bsh6463/JPA

Contribute to bsh6463/JPA development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 자바ORM 표준 JPA 프로그래밍' 카테고리의 다른 글

기본 값 타입  (0) 2021.08.12
[예제] 연관관계 관리  (0) 2021.08.12
즉시 로딩과 지연 로딩.  (0) 2021.08.12
프록시  (0) 2021.08.12
[예제] 상속관계 매핑  (0) 2021.08.11
Comments