用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>
用hibernate自动创建mysql表,添加失败org.hibernate.exception.SQLGrammarException的更多相关文章
- 使用hibernate自动创建Mysql表失败原因
1.使用 schemaExport(hibernate5.2.3)创建Mysql表 @Test public void testSchemaExport() { ServiceRegistry ser ...
- SpringBoot+Mybatis 自动创建数据表(适用mysql)
Mybatis用了快两年了,在我手上的发展史大概是这样的 第一个阶段 利用Mybatis-Generator自动生成实体类.DAO接口和Mapping映射文件.那时候觉得这个特别好用,大概的过程是这样 ...
- SpringBoot使用Hibernate,实现自动创建数据库表【博客数据库设计】
我们准备设计博客,那就要设计数据库. 我们可以使用Hibernate来自动生成数据库. 博客数据库的结构: 实体类: 博客 Blog 博客分类 Type 博客标签 Tag 博客评论 Comment 用 ...
- A.CTable 自动创建数据表
1.添加依赖 <!-- A.CTable 自动创建数据表 --> <dependency> <groupId>com.gitee.sunchenbin.mybati ...
- PHP 创建 MySQL 表
CREATE TABLE 语句用于创建 MySQL 表. 创建表前,我们需要使用 use myDB 来选择要操作的数据库: use myDB; 我们将创建一个名为 "MyGuests&quo ...
- springboot项目启动-自动创建数据表
很多时候,我们部署一个项目的时候,需要创建大量的数据表.例如mysql,一般的方法就是通过source命令完成数据表的移植,如:source /root/test.sql.如果我们需要一个项目启动后, ...
- hibernate动态创建数据库表名几种方式
数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ...
- Hibernate 自动创建表bug问题解决
我在hibernate.cfg.xml配置文件中添加了自动创建表的的属性:(这样当数据库中没有此表是,hibernate就会自动帮我们创建一张表) <property name="hb ...
- Hibernate自动创建表
只要在hibernate.cfg.xml添加这句话,就可以自动生成数据表 <property name="hibernate.hbm2ddl.auto">update& ...
随机推荐
- 微软SQLHelper.cs类 中文版
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...
- iOS 触摸的位置放一个大头针
iOS 触摸的位置放一个大头针 UITapGestureRecognizer *mTap = [[UITapGestureRecognizer alloc] initWithTarget:self a ...
- 【学习笔记】【C语言】选择结构-if
1.if的第1种结构 if(条件) { 语句1; 语句2; ...... } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句: 如果条件为假, ...
- XtraGrid使用心得(折叠式主细档、分组统计)
XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXView中.GridContro ...
- FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议
FastSocket这个东西上次我已经说过,它使用简单,功能强大,扩展灵活,目前在新浪的生产环境中已经被广泛使用,所以它的性能,安全等各方面我们绝对可以信赖,今天我们来说一个话题,和上一讲有关,这次我 ...
- Ueditor 1.4.3 单独调用上传图片,或文件功能
第一步, 引入文件 <script src="ueditor/ueditor.config.js" type="text/javascript" char ...
- AOJ 0121 Seven Puzzle
7 パズル 7 パズルは 8 つの正方形のカードとこれらのカードがぴたりと収まる枠で構成されています.それぞれのカードには.互いに区別できるように 0, 1, 2, ..., 7 と番号がつけられてい ...
- 隐藏虚拟键盘,解决键盘挡住UITextField问题
再正式开始之前,先来介绍一下IOS的键盘类型: 一.键盘风格 UIKit框架支持8种风格键盘 ? 1 2 3 4 5 6 7 8 9 10 typedef enum { UIKeyboard ...
- UIPickerView基本用法
#import "ViewController.h" #import <UIKit/UIKit.h> @interface ViewController : UIVie ...
- 杀死进程 kill -9
cui@bug:~$ killall -h 用法: killall [选项]... [--] 进程名... killall -l, --list killall -V, --version -e,-- ...