글 작성자: beaniejoy

김영한님 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-autocreate로 설정한 상황에서 코드 실행하면 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)

 

Features

  Features Feature List H2 in Use Connection Modes Database URL Overview Connecting to an Embedded (Local) Database In-Memory Databases Database Files Encryption Database File Locking Opening a Database Only if it Already Exists Closing a Database Ignore

www.h2database.com

이런 설정없이 잘 동작했던 것이 지금은 에러가 발생하는 것으로 보아서 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"/>