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에서 자식 삭제하지 않음, 부모의 리스트에서 자식 들고있지 않음
- 딜리트문 당연히 안나감 - 멤버에서나 빠진거지 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가 지맘대로 삭제할수 읎다는것!