/**
* cascade = CascadeType.PERSIST || cascade = CascadeType.ALL
* => orderList에 연관된 order 엔티티들을 추가 시키면, order 엔티티들을 추가로 persist() 하지 않아도,
* 연관된 member 엔티티를 persist() 해주면 orderList에 있는 order 엔티티들도 자동으로 persist() 됨
*
* 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 X
* 단지 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함 을 제공할 뿐
*
* Parent랑 Child의 라이프사이클이 동일할 때(ex: 등록, 삭제) && 단일 소유자일때(Child와 연관관계가 성립되어 있는 Parent엔티티가 하나만 있을때)
*/
@OneToMany(mappedBy = "memberId", cascade = CascadeType.PERSIST) // Order에서 외례키로 설정되어 있는 memberId 변수를 mappedBy로 설정
private List<Order> orderList = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member memberId;
transaction.begin();
try {
Member member = new Member();
member.setName("memberA");
Order orderA = new Order();
Order orderB = new Order();
orderA.setMemberId(member);
orderB.setMemberId(member);
member.getOrderList().add(orderA);
member.getOrderList().add(orderB);
em.persist(member);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
}
Child 엔티니인 orderA랑 orderB에 대한 persist()는 하지 않고, Parent 엔티티인 member에 대해서만 persist()를 했음에도 orderA랑 orderB 엔티티들이 persist() 됐음을 확인할 수 있습니다. 이러한 이유는 Cascade 때문입니다.
Cascade는 연관관계 매핑한 것이랑은 아무런 연관이 없고, 이미 연관관계가 성립된 엔티티들에 대해서 한번에 같이 영속화 해주는 편리함을 제공할 뿐이다.
Cascade를 사용하되, Parent랑 Child 엔티티가 등록, 삭제 등 라이프 사이클이 비슷하거나 똑같을때, 그리고 Child 엔티티가 하나의 Parent엔티티하고만 연관관계가 성립되어 있을때 사용하는 것을 권장합니다.