inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

영속성 전이(CASCADE)와 고아 객체

CascadeType.ALL로 부모나 자식을 remove할 때 질문입니다

해결된 질문

723

TaeHyeon Kim

작성한 질문수 18

0

안녕하세요!

강의 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 한명만 따로 삭제는 불가능한건가요? 

감사합니다 :)

cascade java orphanremoval remove JPA

답변 2

1

TaeHyeon Kim

감사합니다!

catch 부분에서 e.printStackTrace() 를 호출하였더니

java.lang.IllegalArgumentException: Removing a detached instance

에러가 발생함을 확인하여 구글링 후 아래 링크를 참고해 해결하였습니다 :)

https://okky.kr/article/439344

Child findChild = em.find(Child.class, child1.getId());
em.remove(findChild);

이렇게 하여 다시 영속성 컨텍스트에 저장시켜 삭제했더니 child1만 잘 지워지는 걸 확인했습니다!

1

김영한

안녕하세요. TaeHyeon Kim님

뭔가 좀 이상하네요^^

혹시 중간에 예외가 발생해서 커밋이 안된 것일 가능성이 있습니다.

catch 부분에서 e.printStackTrace()를 호출해보시겠어요?

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

28

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

실무 조언 관련 질문입니다.

0

47

1

H2데이터베이스 파일 생성

0

56

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

53

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

52

1

JPQL 메소드와 락

0

55

1

Delivery @OneToOne

0

60

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

94

2

UnsupportedOperationException 발생

0

86

3

H2 Database 연결이 안됩니다.

0

95

2

연관관계 매핑 질문드립니다.

0

85

2

h2데이터베이스 실행오류

0

108

2

persistence.xml

0

108

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

80

1

영속성 컨텍스트

0

66

1

JPA 프록시

0

96

1

Native Query와 MyBatis

0

70

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

87

1

임베디드 타입 예시 코드 관련 질문

0

115

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

95

3

인텔리제이 패키지 커서 단축키 질문

0

108

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

145

1