JPA Cascade

KMS·2022년 4월 7일
0

JPA Basics

목록 보기
11/20

cascade = CasCadeType.PERSIST

Parent 엔티티

	/**
     * 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<>();

Child 엔티티

	@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엔티티하고만 연관관계가 성립되어 있을때 사용하는 것을 권장합니다.

profile
Student at Sejong University Department of Software

0개의 댓글