用hibernate自动创建mysql表,添加失败org.hibernate.exception.SQLGrammarException

来源:互联网 发布:淘宝vip福利群 编辑:程序博客网 时间:2024/06/05 05:37

        今天遇到了一个很坑人的问题,从昨晚一直搞到今天早上,终于发现了,先整理下:

       【背景】:利用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.MySQL5Dialecthibernate.hbm2ddl.auto=update hibernate.show_sql=falsehibernate.format_sql=falsehibernate.cache.use_second_level_cache=truehibernate.cache.use_query_cache=falsehibernate.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>




原创粉丝点击