(JPA) 지속성 전환

  • 영구 전환이란 무엇입니까?

즉, 일관성을 전송합니다. 특정 엔터티가 영구화되면 관련 엔터티도 영구화됩니다.


  • 어떤 경우에 사용하나요?

코드로 알아보자!

먼저 다대일 관계에 부모와 자식이 있다고 가정해 봅시다.

@OneToMany(mappedBy = "parent")
private List<Child> childList = new ArrayList<>();
        Child child1 = new Child();
        Child child2 = new Child();

        Parent parent = new Parent();
        
        parent.addChild(child1);
        parent.addChild(child2);
        
        parentRepository.save(parent);
        
        //parent클래스에 child add
        public void addChild(Child child) {
        childList.add(child);
        child.setParent(this);
    	}

코드를 보면 child1, child2 및 parent 두 개체를 만들고 데이터베이스에 부모만 저장합니다. 결과는 어떻게 될까요?

물론 예상대로 부모만 저장됩니다.


쿼리만 보면 부모만 저장되어 있는 것을 알 수 있습니다.

그렇게 생각할 수 있습니다.

부모를 저장할 때 child1과 child2를 함께 저장하고 싶은데 방법이 없을까요?

이렇게 하면 계단식 매핑 옵션을 사용할 수 있습니다.

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();

위와 같이 캐스케이드 옵션을 설정하십시오.

        Child child1 = new Child();
        Child child2 = new Child();

        Parent parent = new Parent();
        
        parent.addChild(child1);
        parent.addChild(child2);
        
        parentRepository.save(parent);
        
        //parent클래스에 child add
        public void addChild(Child child) {
        childList.add(child);
        child.setParent(this);
    	}

코드를 실행할 때

삽입 쿼리가 세 개의 부모, child1 및 child2를 반환하는 것을 볼 수 있습니다.


  • 고려해야 할 사항
    • 지속성 재정의는 매핑 연결과 관련이 없습니다.
    • 엔터티를 유지할 때 연결된 엔터티도 유지할 수 있는 가능성을 제공합니다.
    • 반드시 일대다 관계에서 사용되는 것은 아닙니다. 자녀가 부모에 의해서만 관리되는 경우에만 사용하십시오. 여기 저기 다른 상위 클래스를 사용하는 경우 X를 사용하십시오.

  • CASCADE 유형
    • ALL: 모두에게 적용
    • 머무르다: 진행 중
    • 제거: 삭제
    • 병합: 병합
    • 업데이트
    • 분리하다

추가할 고아 개체…