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

时间:2022-08-22 14:54:15

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

【背景】:利用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&plus;Mybatis 自动创建数据表(适用mysql)

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

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

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

  4. A&period;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. Linux查看系统开机时间

    有时候需要查看Linux系统运行了多久时间,此时需要知道上次开机启动时间: 有时候由于断电或供电故障突然停机,需要查看Linux开机时间/重启时间:  下面总结一些查看Linux开机关机时间的方法(非 ...

  2. hadoop 性能调优与运维

    hadoop 性能调优与运维 . 硬件选择 . 操作系统调优与jvm调优 . hadoop运维 硬件选择 1) hadoop运行环境 2)  原则一: 主节点可靠性要好于从节点 原则二:多路多核,高频 ...

  3. PHP常用功能

    1.PHP字符串 字符串声明 变量=''或者""(一般情况会使用单引号,因为写起来会比较方便) $str = 'Hello PHP'; echo $str; strpos 计算字符 ...

  4. F-Dining Cows&lpar;POJ 3671&rpar;

    Dining Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7584   Accepted: 3201 Descr ...

  5. linux 命令行更新sdk

    ./android list sdk --proxy-host android-mirror.bugly.qq.com --proxy-port 8080 --no-ui -a -s ./androi ...

  6. Android开发8:UI组件TextView&comma;EditText&comma;Button

    版本:Android4.3 API18 学习整理:liuxinming TextView 概述 TextView直接继承了View(EditText.Button两个UI组件类的父类) TextVie ...

  7. HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong&lowbar;12的专栏 - 博客频道 - CSDN&period;NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  8. Verilog HDL小练习

    5s内15Hz4个LED闪烁,再两秒熄灭,循环往复. 引入en,可以使得4个LED灯全亮,以及恢复周期变化. module led(clk_27MHZ, en, led1, led2, led3, l ...

  9. C&num;中引用第三方ocx控件引发的问题以及解决办法

    调用OCX控件的步骤:1.在系统中注册该ocx控件,命令:regsvr32.exe 控件位置(加 /u 参数是取消注册)2.在.net的工具箱中添加该控件,拖到form中去就可以了. 不用工具箱的话, ...

  10. JavaScript-点击表格的表头进行排序

    HTML如下: <table class="heroinfo"> <thead title="点击排序"> <tr> &lt ...