인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이도님의 프로필 이미지
이도

작성한 질문수

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

hibernate.dialect 관련 질문입니다.

작성

·

1.2K

0

persistence.xml파일 내부에 dialect를 기본으로 작성하면 아래처럼 에러가 발생하여 인터넷 검색을 통해 해결하였습니다.

그러나 수정한코드에는 선이그어져 있어서 사용하면 안된다는 의미인것같아서요

문제는 해결했는데 정확한 원인을 모르고 넘어가는것같아 답답하여 질문합니다.

결론: 같은 dbms안에서도 방언의 종류가 여러종류인지 이런걸 판단하는 방법이 무엇인지 알고싶습니다.

  ex) mysqldialect vs mysql5dialect  vs mysql5innodialect

mysql사용 에러발생

-> mysql5Inno사용 에러미발생 그러나 deprecated 메세지 발생

-> mysql5사용 해결완료

에러내용: 

<property name="hibernate.hbm2ddl.auto" value="create"/>

위처럼 테이블을 삭제하고 자동 생성해주는 코드 추가시 발생하는 에러였습니다.

1. mysqldialect방언 사용시 : type=MyISAM을 맨뒤에 붙이면서 에러가발생합니다.

    create table Member (

       id bigint not null auto_increment,

        age integer,

        name varchar(255),

        primary key (id)

    ) type=MyISAM

2. mysql5innodbdialec방언 사용시: engine=InnoDB을 맨뒤에 붙이면서 쿼리가 잘 작동합니다.

    create table Member (

       id bigint not null auto_increment,

        age integer,

        name varchar(255),

        primary key (id)

    ) engine=InnoDB

에러전문------------------

ibernate: 

    

    create table Member (

       id bigint not null auto_increment,

        age integer,

        name varchar(255),

        primary key (id)

    ) type=MyISAM

10월 28, 2020 10:09:03 오전 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection

INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@2d5ef498] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

10월 28, 2020 10:09:03 오전 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException

WARN: GenerationTarget encountered exception accepting command : Error executing DDL "

    create table Member (

       id bigint not null auto_increment,

        age integer,

        name varchar(255),

        primary key (id)

    ) type=MyISAM" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "

    create table Member (

       id bigint not null auto_increment,

        age integer,

        name varchar(255),

        primary key (id)

    ) type=MyISAM" via JDBC Statement

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:439)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:423)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:314)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135)

at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:156)

at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73)

at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:316)

at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469)

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259)

at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)

at hellojpa.JpaMain.main(JpaMain.java:10)

Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=MyISAM' at line 6

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)

at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:764)

at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:648)

at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)

... 15 more

답변 1

2

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

안녕하세요. 이도님

본인 데이터베이스 버전에 맞는 Dialect를 찾아야 합니다.

방언은 보통 데이터베이스 이름 + 버전으로 되어 있습니다. 본인 버전에 최대한 가까운 것을 선택하면 됩니다.

그리고 MySQL이 추가로 좀 디테일한 내용이 있습니다.

MySQL은 과거 MyISAM이라는 엔진이 있었는데, 지금은 innodb만 사용한다고 보시면 됩니다.

mysqldialect: 과거 버전5.x 이전

mysql5dialect: 5.x 버전

mysql5innodialect: 5.x innodb를 사용, 지금은 최신 버전과 엔진 선택 방법을 바꿈

최신 데이터베이스면 다음 둘중 하나를 선택하시면 됩니다.

MySQL55Dialect 5.5 버전

MySQL57Dialect 5.7 버전

감사합니다.

이도님의 프로필 이미지
이도

작성한 질문수

질문하기