[인프런 김영한] JPA - 영속성전이(CASCADE)

2021. 2. 11. 17:27프로그래밍 언어/Spring Framework

[인프런 김영한] JPA - 영속성전이(CASCADE)


해당 글은 인프런 김영한강사님의 영상을 보고 정리한 글입니다.

Spring Boot, Spring Data JPA를 사용해 실습하였습니다.

김영한 인프런 : www.inflearn.com/users/@yh

 

인프런 - 김영한의 강의들을 만나보세요.

우아한형제들 개발 팀장 (전: 카카오, SK플래닛) 저서: 자바 ORM 표준 JPA 프로그래밍

www.inflearn.com


▣ 영속성전이(CASCADE)

* 특정 Entity를 영속 상태로 만들 떄 연관된 Entity도 함께 영속상태로 만들고 싶을 때.

 - 부모(1) Entity를 저장 할 때 자식(*) Entity도 함께 저장하고 싶을 때.

 

◈ 영속성전이 주의사항

* 영속성 전이는 연관관계 매핑하는것과 아무 관련이 없음.

 - Entity를 영속화 할 때 연관된 Entity도 함께 영속화하는 편리함을 제공할뿐임.

* 다른 Entity가 Child와 연관이 있으면 해당 CASCADE를 사용하면 안된다.

 - Parent와 Child의 LifeCycle이 동일할때 (등록,삭제 등) 사용하기

 - 단일 Entity에 완전히 종속적일 때 사용하면 괜찮다.

 

◈ CASCADE 옵션

 - ALL : 모두 적용

 - PERSIST : 영속

 - REMOVE : 삭제

 - MERGE : 병학

 - REFRESH : refresh

 - DETACH : detach

 

 

 

 

Parent

@Entity
public class Parent {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

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

    public void addChild(Child child){
        childList.add(child);
        child.setParent(this);
    }

}

 

Child

@Entity
public class Child {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

}

 

 

▣ 실행

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

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

parentRepository.save(parent);
childRepository.save(child1);
childRepository.save(child2);

// 실행 쿼리
Hibernate: 
    insert 
    into
        parent
        (name, id) 
    values
        (?, ?)
Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        child
        (name, parent_id, id) 
    values
        (?, ?, ?)
Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        child
        (name, parent_id, id) 
    values
        (?, ?, ?)

| Parent 중심으로 개발하고 싶은데 Parent를 저장할 때 함께 Child도 함께 저장하고 싶다고 생각하실 수 있습니다.

이 때 사용하는데 CASCADE 입니다.

 

 


 

◈ 수정

Parent

@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);
//  childRepository.save(child1);
//  childRepository.save(child2);


// 실행 쿼리
Hibernate: 
    insert 
    into
        parent
        (name, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        child
        (name, parent_id, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        child
        (name, parent_id, id) 
    values
        (?, ?, ?)

| @OneToMany의 옵션에 cascade = CascadeType.ALL을 설정하면 Parnet를 저장할 때 Child도 함께 저장됩니다.

 

 

 

 

 

 

Parent