JPA Entity를 DB저장 및 삭제를 할때 연관된 객체도 함께 작업해주는 편의기능이 있습니다.
이를 영속성 전이 cascade
라고 합니다.
cascade에는 6가지 방법이 있습니다. 아래 3가지를 그나마(?) 자주 사용합니다.
• ALL: 모두 적용
• PERSIST: 영속
• REMOVE: 삭제
• MERGE: 병합
• REFRESH: REFRESH
• DETACH: DETACH
사용법은 아래와 같습니다.
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name ="MEMBER_ID")
private Long id;
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<Order> orders = new ArrayList<>();
}
// main
Order order1 = new Order();
Order order2 = new Order();
Member member = new Member();
member.getOrders().add(order1);
member.getOrders().add(order2);
em.persist(member); // persist는 member만 했지만 위에 order 두개가 들어가진다.
이것 역시 객체를 관리하기 편리하게하는 옵션입니다.
부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제합니다.
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name ="MEMBER_ID")
private Long id;
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) // 추가해줍니다.
private List<Order> orders = new ArrayList<>();
}
// main
Order order1 = new Order();
Order order2 = new Order();
Member member = new Member();
member.setName("Kim");
member.getOrders().add(order1); // 연관관계를 잡아주는 method가 있으면 두번 선언할 필요 없습니다.(1)
order1.setMember(member); // 연관관계를 잡아주는 method가 있으면 두번 선언할 필요 없습니다.(2)
member.getOrders().add(order2);
order2.setMember(member);
em.persist(member);
em.flush();
em.clear();
Member findMem = em.find(Member.class,member.getId());
findMem.getOrders().remove(0);
// 리스트에서 제거하면 member와는 상관없게되고 그 즉시 삭제 쿼리가 실행됩니다.
여기서는 더 다룰게 없으므로 글을 마칩니다.