JPA Delete 동작이 궁금합니다.
1211
작성한 질문수 3
안녕하세요.
좋은 강의를 제공해주신 덕분에 JPA를 열심히 공부하고 있습니다.
JPA 사용 중에 궁금한 점이 있는데요
delete동작 방식을 보니, em.find로 entity를 조회 후에 em.remove순으로 query가 동작하고 있습니다.
Mysql에서 null인 값을 조건절로 삭제해봐도 에러는 발생하지 않는데, JPA만의 특별한 이유가 있을까요?
두 번째로 궁금한 점도 있습니다ㅎㅎ
JPA에서는 foreign key 제약조건을 위반하지 않기 위해서 모든 sql이 아래의 순서로 동작한다고 합니다.
1. Insert, in the order they were performed
2. Updates
3. Deletion of collection elements
4. Insertion of collection elements
5. Deletes, in the order they were performed
위의 조건으로 인해 하나의 transaction안에서 unique key걸린 값을 remove후 save하면 duplicate error가 발생하는데요.
혹시 이것도 JPA만의 특별한 이유가 있는지 너무너무 궁금합니다!
답변 1
1
안녕하세요. Jaeik Lee님
delete동작 방식을 보니, em.find로 entity를 조회 후에 em.remove순으로 query가 동작하고 있습니다.
-> delete는 스프링 데이터 JPA가 제공하는 기능을 말씀하시는 것 같네요^^ JPA는 엔티티를 제거할 때 기본으로 remove 메서드를 제공합니다. 이 메서드는 엔티티를 파라미터로 받습니다. 그래서 JPA를 추상화한 스프링 데이터 JPA에서 엔티티를 찾아서 remove를 호출합니다. 이렇게 엔티티가 있어야 @PreRemove 같은 이벤트를 받고, Cascade 같은 기능이 동작하기 때문에 JPA는 엔티티를 조회해서 remove를 호출하게 설계되어 있습니다.
두번째 질문
-> 저도 이 부분은 정확히 모르겠지만, 말씀하신데로 foreign key 제약조건을 피하는 방법을 가장 우선시하게 설계했을 것 같습니다. 하나의 트랜잭션 안에서 unique key 걸린 값을 remove 하고 save 하는 문제는 중간에 flush를 호출하면 간단하게 해결할 수 있습니다^^
감사합니다.
강의 관련 외 질문입니다.
0
65
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
86
1
BeanCreationException
0
86
3
Update 후 UpdateMemberResponse 매핑할 때
0
46
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
98
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
81
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
62
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
108
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
83
2
fetch join과 영속화와 OSIV의 관계
0
84
2
Distinct 사용 전 결과에 대한 의문
0
113
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
55
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
77
2
dto 필드 속 엔티티 여부
0
58
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
85
1
DTO 대신 Form 사용은 안되나요?
0
133
1
OSIV ON 상태일 때
0
95
1
fetch join VS fetch join 페이징 궁금증
0
179
2
양방향 연관관계 알아보는 법?
0
104
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2





