콘텐츠로 이동

2021 08 18

2021-08-18

CascadeType.PERSIST

  • 이게뭔데 - 영속성 객체에 수행하는 행동이 자식까지 전파!
  • PERSIST 옵션 줬을 때 자식 객체 삭제하는법 - 뼈대 코드
    @Entity
    public class Member {
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        Long id;
    
        @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST)
        private List<Order> orderList = new ArrayList<>();
    
        private String memberName;
    }
    
    @Entity(name = "ORDERS")
    public class Order {
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        Long id;
    
        @ManyToOne @JoinColumn(name = "member_id")
        private Member member;
    
        private String orderName;
    }
    
    @Test
    void persist() {
        final Order order1 = new Order("order1");
        final Order order2 = new Order("order2");
    
        final Member member = new Member("member");
        member.add(order1);
        member.add(order2);
    
        final Member savedMember = memberRepository.saveAndFlush(member);
    
        final Member findMember = memberRepository.getById(savedMember.getId());
        final List<Order> orderList = findMember.getOrderList();
    
        for (Order order : orderList) {
            orderRepository.delete(order);
        }
        orderList.clear();
        em.flush();
    }
    

    - 자식Repository에서 자식 삭제, 부모의 리스트에서는 자식 들고 있음

    //테스트코드
    for (Order order : orderList) {
        orderRepository.delete(order);
    }
    
    //멤버 엔티티
    @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST)
    

      - 이거 보면 Member의 orderList 안에 있는 객체들 하나하나 지워준거같자나?
      - 근데 딜리트 쿼리가 안나가
      - 왜?
          - 자식 객체를 삭제시킨다고 부모 객체가 알아? 모르자나
          - 트랜잭션 끝나고 부모 객체 FLUSH 할 때 딱 보니까 이제 영속화 할 거 없나~ 하고 보고 이미 영속화 되어있던 친구들은 그냥 내비둔다고 있구나 하고
    

    - 자식Repository에서 자식 삭제, 부모의 리스트에서는 자식 들고 있지 않음

    //테스트코드
    for (Order order : orderList) {
        orderRepository.delete(order);
    }
    orderList.clear();
    
    //멤버 엔티티
    @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST)
    

      - 이제 orderList 안에 있는 주문들도 지웠어. 
      - Member가 들고 있는 Order도 지워줬어
      - 이제 딜리트쿼리가 나가
    

    - 자식Repository에서 자식 삭제하지 않음, 부모의 리스트에서 자식 들고있지 않음

    //테스트코드
    orderList.clear();
    
    //멤버 엔티티
    @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST)
    

      - 딜리트문 당연히 안나감
      - 멤버에서나 빠진거지 Order 객체 그 자체로는 아직 엄연히 존재하는 친구입니다.
    

    - 자식Repository에서 자식 삭제, 부모의 리스트는 고아객체 삭제옵션 있음

    //테스트코드
    for (Order order : orderList) {
        orderRepository.delete(order);
    }
    
    //멤버 엔티티
    @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST, orphanRemoval=true)
    

      - 딜리트 안나감
      - Member가 지금 Order 들고있거든
      - 삭제가 될라고 하고 보니까~ Member가 들고 있어서 이거 그냥 영속화시켜버리고 저장 메타
    

    - 자식Repository에서 자식 삭제 안함, 부모의 리스트 비움, 부모의 리스트는 고아객체 삭제옵션 있음

    //테스트코드
    orderList.clear();
    
    //멤버 엔티티
    @OneToMany(mappedBy = "member", cascade = CascadeType.PERSIST, orphanRemoval=true)
    

      - 이거 딜리트문 나감
      - 부모가 영속화 시키는 입장에서 봤을 때 갈곳을 잃은 고아 객체들은 그냥 삭제 쿼리 날려버리는듯
          - 여기서 생각해볼건 order가 다른 부모를 또 갖고 있다면 Member가 지맘대로 삭제할수 읎다는것!