用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","admin@sohu.com","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>




原文地址:https://www.cnblogs.com/rookiebob/p/3749392.html