初學Hibernate框架---hibernate.cfg.xml中與mysql相關的配置信息問題

剛開始學習Hibernate框架,在測試自動生成數據庫表的時候,出現無法自動創建表的問題
hibernate.cfg.xml配置文件的部分內容:

	<!-- 
			數據庫方言
			不同的數據庫中,sql語法略有區別,指定方言可以讓hibernate框架生成sql語句時,針對數據庫的方言生成===如:mysql的limit(分頁用的)
			sql99標準:
					DDL  定義語言  庫、表的增刪改查
					DCL 控制語言		事務   權限
					DML 操縱語言   增刪改查
			注意:MySQL在選擇方言時,選擇最短的這個方言(所有引擎的數據庫都通用)
	 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 
			## auto schema export   自動導出表結構  自動建表
			
			#hibernate.hbm2ddl.auto create				自動建表,每次框架運行都會創建新的表,舊錶將會被覆蓋,表數據會丟失(開發環境中測試使用
			#hibernate.hbm2ddl.auto create-drop		自動建表.每次框架運行結束都會將所有表刪除
			#hibernate.hbm2ddl.auto update				自動生成表,如果已經存在不會再生成.如果表又變動,則自動更新表(不會刪除任何數據)
			#hibernate.hbm2ddl.auto validate			校驗,不自動生成表,每次啓動會校驗數據庫中表是否正確(如:表不存在,則報錯)
		 -->
   	 <property name="hibernate.hbm2ddl.auto">update</property>

運行下面代碼時,報錯

public class Demo1 {
	@Test
	public void fun1() {
		//保存客戶
		Configuration conf=new Configuration().configure();
		SessionFactory sessionFactory = conf.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		//		------------------------------------------------------------------
		//在打開事務和提交事務之間,對數據庫進行操作
		Customer c=new Customer();
		c.setCust_name("Google");
		session.save(c);//執行保存
		
		//		------------------------------------------------------------------
		tx.commit();
		session.close();
		sessionFactory.close();
	}
}

報錯信息如下:

九月 18, 2019 5:03:19 下午 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL "
    create table cst_customer (
       cust_id bigint not null auto_increment,
        cust_name varchar(255),
        cust_source varchar(255),
        cust_industry varchar(255),
        cust_level varchar(255),
        cust_linkman varchar(255),
        cust_phone varchar(255),
        cust_mobile varchar(255),
        primary key (cust_id)
    ) type=MyISAM" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
    create table cst_customer (
       cust_id bigint not null auto_increment,
        cust_name varchar(255),
        cust_source varchar(255),
        cust_industry varchar(255),
        cust_level varchar(255),
        cust_linkman varchar(255),
        cust_phone varchar(255),
        cust_mobile varchar(255),
        primary key (cust_id)
    ) type=MyISAM" via JDBC Statement
	at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:559)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:504)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.createTable(AbstractSchemaMigrator.java:277)
	at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:71)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207)
	at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114)
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184)
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:315)
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
	at cn.ggs.a_generator.Demo1.fun1(Demo1.java:19)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	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.InvokeMethod.evaluate(InvokeMethod.java:17)
	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:89)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
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 11
	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:782)
	at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:666)
	at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
	... 36 more

原因:
hibernate裏的dialect和Mysql的版本不匹配
解決方法:
本萌新使用的數據庫版本爲MySQL8.0.16
修改hibernate.cfg.xml文件

MySql5.0之前的配置
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

MySql5.0之後的配置
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

也就加多個數字5,修改後就能正常的建表插入數據啦!!!

參考的博客:https://www.cnblogs.com/chashaotree/p/11093121.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章