인프런 커뮤니티 질문&답변

bk님의 프로필 이미지
bk

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

cascade 질문입니다

작성

·

792

0

부모엔티티에서 자식엔티티를 mappedby로 양방향 잡으면 readonly로 데이터 생성 변경 모두 불가하지만 cascade를 사용하면 가능하다라고 이해하는게 맞는건가요?

반대로 자식엔티티에 조인된 부모엔티티에 cascade하고 자식엔티티에 부모엔티티넣으면 pk뿐만 아니라 부모도 함께만들어 진다

즉, 방향성이든 주인이든 상관없이 같이 영속상태가되어 저장된다고 이해하면 맞을까요?

답변 1

13

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요 bk님

명확하게 답변을 드리자면, 마지막에 말씀해주신 부분이 맞습니다.

cascade는 mappedBy, 양방향 등등과 전혀 관계가 없습니다.

복잡하게 다른 것과 엮어서 고민하지 않으셔도 됩니다^^

단순하게 A -> B 관계가 cascade로 되어 있으면 A엔티티를 PERSIST할 때 B 엔티티도 연쇄해서 함께 PERSIST 해버린다고 이해하시면 됩니다.

감사합니다.

A 가 Child B가 Parent 엔티티 라고 할때 

Child  -> Parent  형태에서 cascade로 되어있으면 Parent  엔티티를 PERSIST 할때 Child 엔티티도 PERSIST 한다 로 이해하는게 맞을까요 ??

Child -  ManyToOne 

Parent - OneToMany 

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 원석나님

제가 답을 바로 드릴 수도 있지만, 그러면 많은 것을 얻어가실 수 없으니, 이 부분은 직접 한번 코드로 테스트해보시고 결과를 남겨주시면 더 많은 것을 얻어가실 수 있을거에요.

감사합니다.

직접한건 아니지만 수업들으면서 답이 나왔습니다 ㅎㅎ 부모 따라서 같이 흘러가네요 !!

안녕하세요. 최근 강의를 들으면서 궁금한 점이 생겼는데

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)

@JoinColumn(name = "delivery_id")

private Delivery delivery; //배송정보


ORDERS 와 DELIVERY 은 1대 1 관계이고 ORDERS가 주인이 되서 외래키(DELIVERY_ID) 를 가지고 있는데

만약 아래의 코드처럼 주문의 delivery 를 가져오고 setId를 할 경우 order 테이블 과 delivery 테이블의 delivery_id 컬럼이 두개 다 변경된다고 보면 될까요?

Order order = new Order();

order.getDelivery().setId();





자답입니다.

1) jpa는 pk를 수정하면 안된다.

2) cascade는

Order order = ~~~

Delivery delivery = ~~~

order.setDelivery(delivery);

em.persist(order);

 

--> cascade 가 처리되어 있으면 order 생성 및 delivery 를 생성한다.

--> cascade 가 처리되어 있지 않으면 에러 발생 --> 이런 경우 아래 처럼 delivery 도 영속성에 넣어야 함

 

Order order = ~~~

Delivery delivery = ~~~

em.persist(delivery);

order.setDelivery(delivery);

em.persist(order);

 

 

bk님의 프로필 이미지
bk

작성한 질문수

질문하기