Hibernate自动生成数据表失败:hibernate作为项目中的持久层,其中比较方便的就是自动生成数据表,但是在配置文件中需要使用方言来进行配置。
在mysql中有三个方言,分别是 org.hibernate.dialect.MySQLDialect、org.hibernate.dialect.MySQLInnoDBDialect和org.hibernate.dialect.MySQLMyISAMDialect,其中InnoDB和ISAMD分别表示mysql中的两种引擎。
通过三种方言的名称可以知道org.hibernate.dialect.MySQLInnoDBDialect和org.hibernate.dialect.MySQLMyISAMDialect继承于org.hibernate.dialect.MySQLDialect。
在进行自动生成数据表的时,如果使用org.hibernate.dialect.MySQLInnoDBDialect方言则会发生以下错误
3089 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Unsuccessful: create table employee (id integer not null, name varchar(255), email varchar(255), hiredate datetime, primary key (id)) type=InnoDB 3089 [main] ERROR org.hibernate.tool.hbm2ddl.SchemaExport - 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 1 3089 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - schema export complete Hibernate: select max(id) from employee 3188 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1146, SQLState: 42S02 3188 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Table 'test.employee' doesn't exist Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not fetch initial value for increment generator at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:131) at org.hibernate.id.IncrementGenerator.generate(IncrementGenerator.java:68) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:546) at com.ztx.view.TestMain.addEmployee(TestMain.java:77) at com.ztx.view.TestMain.main(TestMain.java:16) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.employee' doesn't exist 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:3970) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962) at org.hibernate.id.IncrementGenerator.getNext(IncrementGenerator.java:109) ... 12 more但是使用org.hibernate.dialect.MySQLDialect就能够自动生成,MySQLDialect是兼容性方言。MySQLInnoDBDialect支持事务,如果数据库版本是5.5以下,就可以直接用,如果是5.5版本及以上,需要改成MySQL5InnoDBDialect或者用MySQLDialect都可以用。