hibernate.dialect 관련 질문입니다.
1248
작성한 질문수 1
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 버전
감사합니다.
실무 조언 관련 질문입니다.
0
40
1
H2데이터베이스 파일 생성
0
48
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
46
1
JPQL 메소드와 락
0
49
1
Delivery @OneToOne
0
55
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
85
2
UnsupportedOperationException 발생
0
80
3
H2 Database 연결이 안됩니다.
0
87
2
연관관계 매핑 질문드립니다.
0
79
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
101
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
76
1
영속성 컨텍스트
0
61
1
JPA 프록시
0
87
1
Native Query와 MyBatis
0
62
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
104
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
134
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
173
2





