用hibernate自動創建mysql表,添加失敗org.hibernate.exception.SQLGrammarException

        今天遇到了一個很坑人的問題,從昨晚一直搞到今天早上,終於發現了,先整理下:

       【背景】:利用hibernate自動給mysql創建一個表,然後爲表裏面添加一行記錄,非常的簡單(當然其中還涉及到spring框架的問題,其實就是用spring接管了數據源和會化工廠的一些配置而已)

        好了,問題開始,一下是數據源和會話工廠的一些配置信息:

	<!--配置數據源  -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName"
			value="org.gjt.mm.mysql.Driver" />
		<property name="url"
			value="jdbc:mysql://localhost:3306/cbdb1?useUnicode=true&characterEncoding=UTF-8" />
		<property name="username" value="root" />
		<property name="password" value="root" />
		<!-- 連接池啓動時的初始值 -->
		<property name="initialSize" value="3" />
		<!-- 連接池的最大值 -->
		<property name="maxActive" value="500" />
		<!-- 最大空閒值.當經過一個高峯時間後,連接池可以慢 慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle爲止 -->
		<property name="maxIdle" value="2" />
		<!--  最小空閒值.當空閒的連接數少於閥值時,連接池就會預申請去一些連接,以免洪峯來時來不及申請 -->
		<property name="minIdle" value="1" />
	</bean>

	<!-- 配置會話工廠 -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 設置數據源 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 接管了hibernate對象映射文件 -->
		<property name="mappingResources">
			<list>
				<value>com/cb/domain/Employee.hbm.xml</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<value>
				hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
				hibernate.hbm2ddl.auto=update 
				hibernate.show_sql=false
				hibernate.format_sql=false
				hibernate.cache.use_second_level_cache=true
				hibernate.cache.use_query_cache=false
				hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
			</value>
		</property>		
	</bean>
        接下來是hibernate-mapping的一些配置

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cb.domain">
	<class  name="Employee" table="employee">
	<!-- 主鍵策略 -->
	<id name="id" type="java.lang.Integer">
	<generator class="identity"/>
	</id>
	<property name="email" type="java.lang.String">
	<column name="email" length="64"></column>
	</property>
	<property name="hiredate" type="java.util.Date">
	<column name="hiredate"/>
	</property>
	<property name="name" type="java.lang.String">
	<column name="name" length="64"/>
	</property>
	<property name="salary" type="java.lang.Float">
	<column name="salary"/>
	</property>
	<property name="pwd" type="java.lang.String">
	<column name="pwd" length="32"/>
	</property>
	<property name="grade" type="java.lang.Integer">
	<column name="grade" length="3"/>
	</property>
	</class>
</hibernate-mapping>

         這裏是Test.java文件的一些信息:

public class Test {
	public static void main(String[] args){
	// 這裏獲得ApplicationContext的對象ac,applicationContext.xml是spring的配置文件
	ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");	
	// 這裏獲得employeeServiceInter對象,該接口被EmployeeService已實現
	EmployeeServiceInter employeeServiceInter=(EmployeeServiceInter)ac.getBean("employeeService");
	//爲Employee添加一條數據,其中id是自增,這裏不用添加
        Employee employee=new Employee("admin","[email protected]","admin",1,new java.util.Date(),234.56f); 
        //調用EmployeeService中已實現的add方法,添加這條記錄
        employeeServiceInter.addEmployee(employee);
    }
}


          好了,問題來了,執行上面的Test.java文件,出現錯誤

          org.hibernate.exception.SQLGrammarException: could not insert: [com.cb.domain.Employee]

         錯誤原因:Caused by: java.sql.SQLException: Table 'cbdb1.employee' doesn't exist

         【解決】:檢查了好幾遍,始終沒有問題,各種配置,主鍵增長策略都考慮到了,還是沒有發現。但是可以肯定的是這個問題一定是由於數據庫沒有自動創建造成的,也就是說hibernate配置出現問題。好了我用以前備份的一些配置信息替換了其中的hibernateProperties配置,問題解決了。這就奇怪了,我以爲是自己單詞拼寫錯誤,檢查幾遍,沒有問題。

         最後發現是因爲hibernateProperties中紅色標記的hibernate.hbm2ddl.auto=update字段,在update後面多了一個空格,系統自動識別給hibernate.hbm2ddl.auto賦值update+“”,此時造成了數據表不能自動創建。刪掉後面的空格,問題解決。

          至此,問題解決!

        【補充】:吸取經驗教訓,以後配置hibernate屬性的時候,還是儘量使用下面這種配置方式,這樣能有效避免賦值的時候出現空格,但是檢查不出來的問題!

<!-- SQL語句顯示--> 
<property name="show_sql">true</property> 
<!-- SQL方言,這邊設定的是MySQL --> 
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 數據表生成策略 --> 
<property name="hbm2ddl.auto">update</property>




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