//parent.addChild(child);
em.persist(parent);
작성
·
168
0
안녕하세요 영한님 강의 중 궁금한 점이 생겨 질문드립니다.
cascade 사용 시 연관관계 메서드 호출없이 persist(parent)를 호출하면 child에 값이 들어가지 않는데 어떤 이유 때문인지 궁금합니다.
cascade를 쓰지않고 각각 persist(parent), persist(child)로 할 때는 db에 값이 잘 들어가네요 ..ㅠㅠ
Parent parent = new Parent();
parent.setName("부모");
Child child = new Child();
child.setName("자식");
child.setParent(parent);
//parent.addChild(child);
em.persist(parent);
답변 2
1
안녕하세요. 에러나면짖는개님, 공식 서포터즈 OMG입니다.
연관관계를 맺는다는 것은 "내가 너를 알게한다" 라고 설명할 수 있을 거같아요.
Parent parent = new Parent();
parent.setName("부모");
Child child = new Child();
child.setName("자식");
child.setParent(parent);
여기 까지의 코드를 보면, 부모가 생성되고 자식이 생성되었습니다. 자식은 부모가 누군지 알지만, 부모는 자식이 누군지 모릅니다.
//parent.addChild(child);
em.persist(parent);
그리고 나서 부모를 영속상태로 만들지만 위에서 말씀드렸던것처럼 부모는 자식이 누군지 모릅니다.
부모가 자식이 누군지 알게 하기위해 parant.addChild(child);를 지정한 것이겠죠 ?
주석을 풀고 확인해보시면 감이 오실꺼라 생각합니다.
감사합니다.
0
양방향 관계에서 cascade를 통해서 영속성 전이를 할 때는 연관관계 메서드가 반드시 필요한 건가요??
cascade를 사용하지 않고 각각 persist()를 할 때는 연관관계 메서드를 안써도 db에는 값이 저장되는데 이 부분이 궁금합니다..
이 경우에는 parent엔티티에 child는 저장되지 않겠지만 db에는 parent와 child 쿼리가 전달되서 값이 저장되지 않나요??
요약하면 다음과 같습니다.
1) 연관관계와 영속성전이는 관계가 없다. 단지 영속화할 때 연관된 엔티티도 같이 영속화하는 기능을 제공한다.
2) 연관관계가 맺어져 있지 않기 때문에 child가 저장되지 않은 것이다.
3) child와 parent를 각각 persist하여 영속화되었고 tx 커밋시점에 db에 쿼리가 날아간 것이다.
ps. 영한님의 JPA 책의 내용을 참고하여 답변드렸는데 강의에서도 관련되어 설명하신 부분이 있는지 확인하여 있으면 답변 드리도록하겠습니다.
=> 강의 맨 앞에서 설명하고 계시네요 ㅎㅎ;; 처음~1분 정도를 참고하시면 cascade는 연관관계 지연로딩, 즉시로딩과는 전혀 상관없다고 말씀하시는 부분이 있네요. 영한님 설명을 다시한번 듣고 오시면 이해에 도움이 되리라 생각합니다.
영속성 전이 cascade는 엔티티를 영속화 할 때 연관된 엔티티도 같이 영속화하는 편리함을 제공하는데요, 연연관계를 매핑하는 것과는 관련이 없어서 첫 질문글에서 말씀하신대로
cascade 사용 시 연관관계 메서드 호출없이 persist(parent)를 호출하면 child에 값이 들어가지 않는 것입니다.
cascade여부와 상관없이 연관관계가 맺어져 있지 않기 때문입니다.
--
cascade를 쓰지않고 각각 persist(parent), persist(child)로 할 때는 db에 값이 잘 들어가네요 ..
=>
이 부분도 parent와 child를 각각 영속상태로 만들었고 이후 트랜잭션 커밋 시점에 영속성컨텍스트의 내용이 db에 쿼리로 날아갑니다.