작성
·
280
1
※ 참고 : MySQL DB 를 사용하고 있습니다.
아래 사진처럼 SecureSetting, SessionTimeoutSetting 2개의 엔티티를 JOINED 전략을 이용해 상속관계 매핑을 해주었습니다. 그런데 3번째 사진처럼 테스트 코드를 작성하고 실행한 결과, ss_configuration 테이블에는 데이터가 잘 들어가는데 ss_session_timeout 테이블에는 데이터가 들어가지 않습니다. 쿼리로 로그 찍힌걸 봐도 insert 쿼리는 2번 나간것을 확인하였습니다. 혹시나 싶어서 SecureSetting 클래스의 @Id 전략을 AUTO 로 바꾸고 하면 잘 되었습니다. JOINED 전략에서는 Id 전략 중 IDENTITY 전략을 사용할 수 없나요?
답변 2
2
안녕하세요! 어제 너무 급하게 이슈 올리느라 인삿말도 빼먹었네요ㅠㅠ
다행히 이슈 원인 찾아서 해결했습니다. 아래에 내용 공유드립니다.
현재 저는 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. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
우와~ 찾아서 해결하셨군요. 멋진 공유까지 진심으로 감사합니다^^!