Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] CASCADE

by skahn1215 2021. 8. 22.
728x90
반응형

CASCADE

  • 영속성 전이라고 한다.
  • 연관된 엔티티를 같이 영속화 하는 기능이다.
  • 연관관계 맵핑이랑 전혀 상관이 없다.

 

 

CASCADE를 안쓰는 경우

  • Parent 가 Child를 List 로 가지고 있을경우 일반적일때는
  • Parent도 persist 를 해줘야 하고 child도 persist를 해줘야 한다.

 

코드

지금까지 배운 내용을 보면 당연하다.

parent 도 영속성 컨텍스트로 넣어주고

child1, child2 도 영속성 컨텍스트로 넣어줘야 한다.

@Entity
public class Parent {
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    // cascade 를 해주면 child는 알아서 저장된다.
    // collection안에 있는 것들에도 persis를 날려 줄거야
    // cascade: 이것이 연쇄이다.
    // orphanRemoval: 컬렉션의 아이템 삭제시 delete 쿼리 발생
    @OneToMany(mappedBy = "parent")
    private List<Child> childList = new ArrayList<>();
}

 

main 코드

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

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

// 저장시 persist 를 3번 호출해야 된다.
em.persist(parent);
em.persist(child1);
em.persist(child2);

 

 

 

CASCADE를 적용할 경우

  • parent 가 child를 포함하고 있기 때문에 
  • cascade를 써주면 child 도 같이 적용이 된다.
  • 결과에서 보면 자동으로 insert 문이 나가게 된다.
@Entity
public class Parent {
    @Id
    @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;

    // cascade 를 해주면 child는 알아서 저장된다.
    // collection안에 있는 것들에도 persis를 날려 줄거야
    // cascade: 이것이 연쇄이다.
    // orphanRemoval: 컬렉션의 아이템 삭제시 delete 쿼리 발생
    @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);

// 저장시 persist 를 1번만 호출해도 된다
em.persist(parent);
//em.persist(child1);
//em.persist(child2);

 

결과

Hibernate: 
    /* insert cascade.Parent
        */ insert 

        into
            Parent
            (name, MEMBER_ID) 
        values
            (?, ?)

Hibernate: 
    /* insert cascade.Child
        */ insert 
        into
            Child
            (name, parent_id, id) 
        values
            (?, ?, ?)

Hibernate: 
    /* insert cascade.Child
        */ insert 
        into
            Child
            (name, parent_id, id) 
        values
            (?, ?, ?)

 

 

 

CASCADE 종류

여러종류가 있지만 두개를 거의 많이 쓴다.

  • ALL 모두 적용: Life cycle 다 맞출때 쓴다.
  • PERSIST 영속 적용 : 저장할때만 쓴다.

 

 

주의점

  • 다른 곳에 child 가 연관관계가 있을 경우 사용하면 안된다.
  • parent 말고 다른 곳에서 child를 연관관계로 맵핑하고 있다면 사용하면 안된다.

 

고아객체

  • 연관 관계가 끊어진 엔티티를 자동으로 삭제한다.
  • orphanRemoval = true 를 해주면
    - parent에 있는 컬렉션에서 child 아이템을 삭제하면 child에 대한 delete 쿼리가 나간다.
  • parent가 삭제되면 child도 자동으로 삭제 된다.

 

 

중요점

  • child의 생명주기를 parent 에서 관리하는것이다.
728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] 값타입 컬렉션  (0) 2021.09.17
[JPA] 값타입  (0) 2021.08.22
[JPA] Lazy 와 Eager  (0) 2021.08.19
[JPA] 프록시  (0) 2021.08.11
[JPA] @MappedSuperclass  (0) 2021.08.09

댓글