강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của mitinhrdev1150
mitinhrdev1150

câu hỏi đã được viết

Lập trình JPA tiêu chuẩn Java ORM - Cơ bản

Ánh xạ kế thừa

상속관계매핑 중 JOINED 질문드립니다.

Viết

·

368

1

※ 참고 : MySQL DB 를 사용하고 있습니다.

아래 사진처럼 SecureSetting, SessionTimeoutSetting 2개의 엔티티를 JOINED 전략을 이용해 상속관계 매핑을 해주었습니다. 그런데 3번째 사진처럼 테스트 코드를 작성하고 실행한 결과, ss_configuration 테이블에는 데이터가 잘 들어가는데 ss_session_timeout 테이블에는 데이터가 들어가지 않습니다. 쿼리로 로그 찍힌걸 봐도 insert 쿼리는 2번 나간것을 확인하였습니다. 혹시나 싶어서 SecureSetting 클래스의 @Id 전략을 AUTO 로 바꾸고 하면 잘 되었습니다. JOINED 전략에서는 Id 전략 중 IDENTITY 전략을 사용할 수 없나요?

JPAjava

Câu trả lời 2

2

mitinhrdev1150님의 프로필 이미지
mitinhrdev1150
Người đặt câu hỏi

안녕하세요! 어제 너무 급하게 이슈 올리느라 인삿말도 빼먹었네요ㅠㅠ
다행히 이슈 원인 찾아서 해결했습니다. 아래에 내용 공유드립니다.

현재 저는 5.2.18.Final 버전의 하이버네이트를 사용하고 있는데, 위 문제상황은 해당 버전에서 발생하는 버그입니다. 하이버네이트 버전을 5.4.32.FINAL 로 올리면 정상적으로 잘 돌아갑니다. (https://hibernate.atlassian.net/browse/HHH-13617)

다만 좀더 원인을 추측해보자면, JPA 에서는 키 생성전략을 GenerationType.IDENTITY 로 사용하면 JPA의 쓰기지연 전략(write-behind flushing strategy) 과 충돌되기때문에 내부적으로 batch_size 로 처리하지 않고, 단건으로 insert 쿼리를 처리하는 것으로 알고있습니다.

하지만 5.2.18.Final 버전에서 InheritenceType.JOINED 을 GenerationType.IDENTITY 전략과 같이 사용하여 엔티티 저장 시, batch_size 를 사용하지 않는 상황에서 부모 엔티티의 insert 쿼리 + 자식 엔티티의 insert 쿼리 총 2개의 쿼리가 한번에 나가게 되고 이것이 쓰기지연 전략(write-behind flushing strategy) 에 위배되어 버그가 발생한 것이 아닐까 생각이됩니다. 다행히 하이버네이트 최신 버전에서는 이 버그가 수정된 것으로 보입니다.

그래서 제가 찾은 해결법은 아래 2가지 입니다.

1. 하이버네이트의 버전을 높여준다.

2. jpa.properties.hibernate.jdbc.batch_size 설정을 아예 OFF 하거나 1로 사용한다.

잘못된 내용이나 더 좋은 의견 있으시면 공유 부탁드리겠습니다!

yh님의 프로필 이미지
yh
Người chia sẻ kiến thức

우와~ 찾아서 해결하셨군요. 멋진 공유까지 진심으로 감사합니다^^!

0

yh님의 프로필 이미지
yh
Người chia sẻ kiến thức

안녕하세요. mit.inhrdev님

좀 살펴보아야 할 것 같습니다.

H2 데이터베이스를 기반으로해서 해당 부분만 확인할 수 있게 최소화해서 동작하는 예제를 만들어주세요.

그리고 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

Hình ảnh hồ sơ của mitinhrdev1150
mitinhrdev1150

câu hỏi đã được viết

Đặt câu hỏi