JPA- 5. transitive persistence, orphan removal

roon-replica·2022년 8월 9일
0

JPA

목록 보기
5/5

transitive persistence

  • 영속성 전이.
  • 어떤 엔티티를 특정 영속 상태 X로 만들 때, 연관된 엔티티도 함께 X 상태로 만들고 싶을 때 사용하는 기능이라고 함.
    (persist, merge, remove 등과 같은 동작으로 영속 상태 X는 managed(영속화), detached 등이 될 수 있다 )

예제 코드

영속성 전이없이 부모, 자식들 영속화하는 코드

@Entity
public class Parent{
	...
    @OneToMany(mappedBy = "parent")
    private List<Child> childs = new ArrayList<>();
    ...
}

@Entity
public class Child{
	...
    @ManyToOne
    private Parent parent;
    ...
}
void saveNoCascade(){
    // 이런 식으로 parent 먼저 저장하고 나서 child 저장해줘야 함.. 외래키 관계? 참조 무결성 제약 조건때문임
    // 나도 이런식으로 개발했었음......
	parentRepository.save(parent);
    childRepository.save(child1);
    childRepository.save(child2);
}

영속성 전이 기능을 사용해서 부모, 자식들 영속화하는 코드

@Entity
public class Parent{
	...
    @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
    private List<Child> childs = new ArrayList<>();
    ...
}

@Entity
public class Child{
	...
    @ManyToOne
    private Parent parent;
    ...
}
void saveWithCascadePersist(){
	...
	child1.setParent(parent);
    child2.setParent(parent);
    
    // cascade 옵션주면 이 코드만으로 부모뿐만 아니라 자식들까지 저장한다고 함..!
    parentRepository.save(parent); 
    ...
}

영속성 전이없이 부모, 자식들 제거하는 코드

void deleteNoCascade(){
	// 이렇게 하나씩 지워야 하고... child부터 지워야 참조무결성도 지켜짐...
	...
    childRepository.delete(child1);
    childRepository.delete(child2);
    parentRepository.delete(parent);
    ...
}

영속성 전이 기능을 사용해서 부모, 자식들 제거하는 코드

void deleteWithCascadeRemove(){
	// CascadeType.REMOVE만 설정하고 이것만 해주면 된다고 함..!
	parentRepository.delete(parent); 
}

Cascade option 종류

  • ALL
  • PERSIST
  • MERGE
  • REMOVE
  • REFRESH
  • DETACH

orphan removal

  • 부모 엔티티와 연관관계가 끊어진(= 참조가 제거된) 자식 엔티티를 자동으로 삭제하는 기능이라고 함

  • GC 원리같은거네

@Entity 
class Parent{
	...
    @OneToMany(mappedBy = "parent", orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
}

// 여기서 자바 코드에서 "children.remove(someChild);" 만 해도 
// "DELETE FROM CHILD WHERE ID={someChild's ID}" 라는 SQL이 실행된다고 함...!
// 이 SQL도 물론 flush될 때 날아간다고 함

Cascade와 orphan removal을 함께 사용

  • CascadeType.ALL과 orphanRemoval = true를 함께 사용하면 개판이 될거라 예상했는데...
    다시 생각해보니 그건 아니고 깔끔하게 잘 정리가 될거 같다
    cascade remove하면 필요없는거 다 지워질거고
    자동으로 orphanRemoval까지 동작하면 참조 없어진 엔티티들 다 지워질거고..

  • DDD에서 애그리거트 루트 개념 구현할 때 영속성 전이 쓰면 편하다고 함!!!!!!!!!!!

의문점

  • cascade option에서 refresh 모름

  • 연관관계가 끊어졌다는 말은 무슨 말이지?
    -> 참조를 제거했다는 말이라고 함

  • 이런 줄줄이 추가, 삭제하는 기능은 성능상 부담있을듯

  • 이런 기능은 오류가 생기기 쉬울거 같은데 오류 없나..?
    -> 써보고 오류 발견해봐... 오류 거의 없으니까 공개됐겠지...

  • 애그리거트 루트 영속성 전이 써서 구현해보기...

  • cascade, orphan removal은 어떻게 구현되어 있는지 확인해야 하는데..
    코드 볼 수 있으려나? hibernate 코드들 봐야할듯?
    -> package org.hibernate.action.internal에서 볼 수 있는듯!
    (CollectionAction, OrphanRemovalAction)

profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글