zoukankan      html  css  js  c++  java
  • 用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>




  • 相关阅读:
    动态查询 母表和子表的 一种方法
    js的一些正则 整理 长期更新
    fmt 标签格式化 日期
    一些关于 checkbox的前台 jquery 操作 记录
    jQuery 追加元素的方法如append、prepend、before,after(转)
    (Oracle)DBMS_SYSTEM工具-01[20180510]
    MySQL->元数据[20180510]
    MySQL->复制表[20180509]
    MySQL->索引的维护[20180504]
    MySQL-ALTER TABLE命令学习[20180503]
  • 原文地址:https://www.cnblogs.com/rookiebob/p/3749392.html
Copyright © 2011-2022 走看看