@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);
}
부모 엔티티와 연관관계가 끊어진(= 참조가 제거된) 자식 엔티티를 자동으로 삭제하는 기능이라고 함
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 option에서 refresh 모름
연관관계가 끊어졌다는 말은 무슨 말이지?
-> 참조를 제거했다는 말이라고 함
이런 줄줄이 추가, 삭제하는 기능은 성능상 부담있을듯
이런 기능은 오류가 생기기 쉬울거 같은데 오류 없나..?
-> 써보고 오류 발견해봐... 오류 거의 없으니까 공개됐겠지...
애그리거트 루트 영속성 전이 써서 구현해보기...
cascade, orphan removal은 어떻게 구현되어 있는지 확인해야 하는데..
코드 볼 수 있으려나? hibernate 코드들 봐야할듯?
-> package org.hibernate.action.internal에서 볼 수 있는듯!
(CollectionAction, OrphanRemovalAction)