© 版权声明:本文为博主原创文章,转载请注明出处
1.问题描述:
启动hibernate测试案例时报错如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL 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: 438 ) 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: 165 ) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java: 134 ) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java: 120 ) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java: 148 ) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java: 65 ) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java: 459 ) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java: 465 ) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java: 711 ) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java: 727 ) at org.hibernate.test.StudentTest.before(StudentTest.java: 32 ) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 57 ) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43 ) at java.lang.reflect.Method.invoke(Method.java: 606 ) at org.junit.runners.model.FrameworkMethod$ 1 .runReflectiveCall(FrameworkMethod.java: 50 ) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java: 12 ) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java: 47 ) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java: 24 ) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java: 27 ) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java: 325 ) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java: 78 ) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java: 57 ) at org.junit.runners.ParentRunner$ 3 .run(ParentRunner.java: 290 ) at org.junit.runners.ParentRunner$ 1 .schedule(ParentRunner.java: 71 ) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java: 288 ) at org.junit.runners.ParentRunner.access$ 000 (ParentRunner.java: 58 ) at org.junit.runners.ParentRunner$ 2 .evaluate(ParentRunner.java: 268 ) at org.junit.runners.ParentRunner.run(ParentRunner.java: 363 ) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java: 86 ) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java: 38 ) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 459 ) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 675 ) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java: 382 ) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 192 ) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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=InnoDB' at line 8 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java: 57 ) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 45 ) at java.lang.reflect.Constructor.newInstance(Constructor.java: 526 ) at com.mysql.jdbc.Util.handleNewInstance(Util.java: 425 ) at com.mysql.jdbc.Util.getInstance(Util.java: 408 ) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java: 943 ) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 3973 ) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 3909 ) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java: 2527 ) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java: 2680 ) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java: 2486 ) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java: 2444 ) at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java: 845 ) at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java: 745 ) at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java: 54 ) ... 37 more |
2.解决方案:
因为hibernate设置的方言为
1
|
org.hibernate.dialect.MySQLInnoDBDialect |
该方言建表使用的是MySQL5.0之前的“type=InnoDB”SQL语句,但是使用的MySQL版本为5.7.17,“type=InnoDB”不再生效,变为了“ENGINE=InnoDB”
因此需要将方言设置为
1
|
org.hibernate.dialect.MySQL5InnoDBDialect |