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

【背景】:利用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>

用hibernate自动创建mysql表,添加失败org.hibernate.exception.SQLGrammarException的更多相关文章

  1. 使用hibernate自动创建Mysql表失败原因

    1.使用 schemaExport(hibernate5.2.3)创建Mysql表 @Test public void testSchemaExport() { ServiceRegistry ser ...

  2. SpringBoot+Mybatis 自动创建数据表(适用mysql)

    Mybatis用了快两年了,在我手上的发展史大概是这样的 第一个阶段 利用Mybatis-Generator自动生成实体类.DAO接口和Mapping映射文件.那时候觉得这个特别好用,大概的过程是这样 ...

  3. SpringBoot使用Hibernate,实现自动创建数据库表【博客数据库设计】

    我们准备设计博客,那就要设计数据库. 我们可以使用Hibernate来自动生成数据库. 博客数据库的结构: 实体类: 博客 Blog 博客分类 Type 博客标签 Tag 博客评论 Comment 用 ...

  4. A.CTable 自动创建数据表

    1.添加依赖 <!-- A.CTable 自动创建数据表 --> <dependency> <groupId>com.gitee.sunchenbin.mybati ...

  5. PHP 创建 MySQL 表

    CREATE TABLE 语句用于创建 MySQL 表. 创建表前,我们需要使用 use myDB 来选择要操作的数据库: use myDB; 我们将创建一个名为 "MyGuests&quo ...

  6. springboot项目启动-自动创建数据表

    很多时候,我们部署一个项目的时候,需要创建大量的数据表.例如mysql,一般的方法就是通过source命令完成数据表的移植,如:source /root/test.sql.如果我们需要一个项目启动后, ...

  7. hibernate动态创建数据库表名几种方式

    数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ...

  8. Hibernate 自动创建表bug问题解决

    我在hibernate.cfg.xml配置文件中添加了自动创建表的的属性:(这样当数据库中没有此表是,hibernate就会自动帮我们创建一张表) <property name="hb ...

  9. Hibernate自动创建表

    只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表 <property name="hibernate.hbm2ddl.auto">update& ...

随机推荐

  1. Objective-C设计模式——工厂方法模式virtual constructor(对象创建)

    工厂方法模式 工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象. 工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的 ...

  2. 网络HTTP、JSON、XML解析等 复习

    一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...

  3. 20141212--C#对象比较

    static void Main(string[] args) { Class2 oo = new Class2(); oo.shu = ; oo.zi = "你"; Class2 ...

  4. Session State Pattern会话状态模式

    Client Session State 客户会话状态. 在Client端保存会话状态. 运行机制 Client在每次请求时会把所有的会话数据传给Server,Server在响应时把所有的会话状态传给 ...

  5. nyoj71--独木舟上的旅行

    描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量.我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅 ...

  6. javascript给不能修改的函数增加额外处理的方法

    不知道是否可行,但姑且google之. 查看到相关的stack overflow(堆栈溢出)帖子:http://stackoverflow.com/questions/1659219/add-to-a ...

  7. Windows Phone 8.1开发:如何让ListView下拉加载更多?

    Windows Phone 8.1开发中使用ListView作为数据呈现载体时,经常需要一个下拉(拇指向上滑动)加载更多的交互操作.如何完成这一操作呢?下面为您阐述. 思路是这样的: 1.在ListV ...

  8. Java中String类型的不可变性和驻留池

    一 基本概念 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当获得这个类的一个实例引用时,可以改变这个实例的内容. 不可变类:不可变类的实例一但创 ...

  9. 经典SQL语句大全 学者必看

    一.基础 .说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 ...

  10. linux 网桥的配置与实现

    ==================================================================================from: http://www.i ...