[JPA] Hibernate dialect와 H2 데이터베이스 호환 이슈
김영한님 JPA 강의 듣다가 hibernate.dialect
내용을 바꿔서 코드 실행을 하는 부분이 있었는데 이 과정에 겪었던 에러 이슈와 처리했던 내용을 기억하고자 이 곳에 기록하게 되었습니다.
📌 문제 상황
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
jpa 관련 설정은 위의 내용과 같습니다. h2 database를 사용했기 때문에 h2 driver와 db dialect(방언)는 H2Dialect
로 하였습니다.
이렇게 설정하고 jpa 코드 실행하면 아무 문제 없이 잘 수행합니다.
여기서 oracle 쿼리는 어떻게 적용이 되는지 보기 위해 dialect 설정을 Oracle12Dialect
로 변경했는데요. 여기서 문제가 발생합니다.
ddl-auto
를 create
로 설정한 상황에서 코드 실행하면 JPA Entity 내용대로 drop, create 순으로 쿼리가 동작하게 됩니다.
여기서 위와 같은 에러가 발생했는데요. 대략 create 문의 query syntax 오류가 발생했다고 나옵니다.
📌 해결방법
해결방법은 간단합니다.
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test;Mode=Oracle"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
위와 같이 jdbc url에서 맨 끝에 ;Mode=Oracle
를 추가해주면 됩니다.
h2 database document를 보면 compatibility 내용이 있는 것을 볼 수 있습니다.
(h2 database compatibility)
이런 설정없이 잘 동작했던 것이 지금은 에러가 발생하는 것으로 보아서 h2 버전업되면서 DB간 호환 관련 설정이 추가된 것 같습니다.
위 내용으로 설정하고 코드를 다시 실행하면 잘 동작하는 것을 확인할 수 있습니다.
이를 응용해서 MySQL dialect로 하고 싶으면 다음과 같이 설정하면 됩니다.
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test;Mode=MySQL"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
'Spring > JPA' 카테고리의 다른 글
[JPA] UnexpectedRollbackException과 AOP에서 상황별 롤백(rollback)여부에 대해 알아보자 (0) | 2023.06.30 |
---|---|
[JPA] Transactional과 쓰기지연 쿼리에 대한 간단한 이슈 정리(updatedAt 관련) (0) | 2022.12.23 |
[JPA] 변경감지 개념과 @Transactional 위치에 따른 변경감지 사용 (0) | 2022.02.15 |
댓글
댓글(Github)
다른 글
-
[JPA] UnexpectedRollbackException과 AOP에서 상황별 롤백(rollback)여부에 대해 알아보자
[JPA] UnexpectedRollbackException과 AOP에서 상황별 롤백(rollback)여부에 대해 알아보자
2023.06.30 -
[JPA] Transactional과 쓰기지연 쿼리에 대한 간단한 이슈 정리(updatedAt 관련)
[JPA] Transactional과 쓰기지연 쿼리에 대한 간단한 이슈 정리(updatedAt 관련)
2022.12.23 -
[JPA] 변경감지 개념과 @Transactional 위치에 따른 변경감지 사용
[JPA] 변경감지 개념과 @Transactional 위치에 따른 변경감지 사용
2022.02.15