인프런 커뮤니티 질문&답변

mit.inhrdev님의 프로필 이미지
mit.inhrdev

작성한 질문수

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

상속관계 매핑

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

작성

·

282

1

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

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

답변 2

2

mit.inhrdev님의 프로필 이미지
mit.inhrdev
질문자

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

현재 저는 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로 사용한다.

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

김영한님의 프로필 이미지
김영한
지식공유자

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

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. mit.inhrdev님

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

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

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

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

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

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

감사합니다.

mit.inhrdev님의 프로필 이미지
mit.inhrdev

작성한 질문수

질문하기