작성
·
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 버전
감사합니다.