묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
orphanRemoval=true, 고아 객체 질문
안녕하세요~findParent.getChildList().remove(0);강의에서 설명주신 위 코드에 대해 추가 질문이 있습니다.컬렉션에서 첫번째 child 엔터티를 제거한 경우에 고아 객체가 되어 delete 쿼리가 실행되는 것으로 이해를 했는데요.@OneToMany(mappedBy = "XXX", orphanRemoval = true)orphanRemoval만으로는 delete 쿼리가 실행되지 않고, cascade = CascadeType.PERSIST가 함께 실행된 경우에만 delete 쿼리가 실행되더라구요.@OneToMany(mappedBy = "XXX", orphanRemoval = true, cascade = CascadeType.PERSIST)혹시 orphanRemoval 설정만으로는 영속성 전이가 일어나지 않고 cascade = CascadeType.PERSIST을 추가해야지만, findParent.getChildList().remove(0); 호출시에 고아객체가 된 child 엔티티의 생명주기까지 영향을 미칠 수 있게 되어 delete 쿼리가 실행이 되는 것인지 여쭤보고 싶습니다.(즉, 'orphanRemoval'과 '영속성 전이' 설정을 독립적으로 봐야하는 것인지 궁금합니다.)감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
고아객체 제거 활성화시 update 쿼리나가는거에 대해서 문의드립니다.
일대다 단방향 관계(orphanRemoval = false상태)에서, 해당 콜렉션에서 객체가 지워지면 그 대상에 대해서 update forienkey컬럼= null을 해주는 것은 당연하다 생각듭니다. 근데 orphanRemoval=true로 해도 update forienkey컬럼 = null을 먼저 해주고 delete쿼리가 나가더라구요 update쿼리를 굳이 왜? 낭비하는건지 생각들어서요. 흠...... 쓰다보니 생각드는데, JPA의 방식이변경감지 기능이 무조건 먼저 동작해서 외래키필드 먼저 동기화 해주고, 고아객체 제거하는 기능이 나중에 동작해서 그런걸까요? 콜렉션 스냅샷 비교해보면 고아객체 알수 잇을텐데... 다른 이유나 update쿼리 나가는거 꺼버릴수 있는 옵션이 있는지 궁금합니다!
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
CascadeType.ALL로 부모나 자식을 remove할 때 질문입니다
안녕하세요! 강의 14:33 내용의 코드를 치며 공부하던 중 orphanremoval=false일 때 자식을 삭제하기 위해선 어떻게 해야할 지 궁금해져서 아래와 같이 코드를 짜보았습니다. Parent 엔티티 코드는 orphanRemoval=true를 삭제하고 나머지는 모두 강의와 같게 하였습니다. 메인코드는 아래와 같이 작성하였습니다. Parent parent=new Parent(); parent.setName("kth990303"); Child child1=new Child(); child1.setName("kthbaby1"); Child child2=new Child(); child2.setName("kthbaby2"); parent.addChild(child1); parent.addChild(child2); em.persist(parent); // 쿼리 확인을 위한 db에 정보 넘겨주기 em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); // 첫번째 자식 삭제 findParent.getChildren().remove(0); tx.commit(); 당연히 orphanRemoval=true가 아니므로 예상대로 삭제가 되지 않은 상태임을 확인했습니다. 문제는 tx.commit() 바로 위에 em.remove(child1); 이나, em.remove(child2); 나 em.remove(parent); 를 해주면 하나만 삭제되는 것이 아닌, 모두 삭제돼버린다는 점이었습니다. CascadeType.ALL나 CascadeType.PERSIST로 설정해주어서 parent가 삭제되면 children이 모두 삭제되는 것은 예상했지만, child 한명이 삭제될 때, 모든 children과 parent가 삭제될줄은 예상하지 못했습니다. child하나를 삭제할 때, parent까지 삭제된다는 이 부분이 바로 cascade가 연관관계 주인과 상관없이 같이 영속된다고 설명해주신 부분이 맞을까요? 코드 전체에 Parent와 Child 엔티티만 있다고 가정할 때, parent가 child의 단일소유자이므로 cascadetype.ALL나 cascadetype.PERSIST로 설정해준다고 하면, orphanRemoval=true를 하지 않는 한, child 한명만 따로 삭제는 불가능한건가요? 감사합니다 :)