Hibernate中Javabean不能自动生成MySQL表结构问题

时间:2022-06-21 10:39:50

Hibernate中,在用Javabean自动生成MySQL的时候,在已经手动创建数据库的情况下,总是表结构生成失败,关键是还不报错,苦恼了半天,于是开始在寻找解决的方法。首先贴上我的代码。

Javabean

package com.itheima.domain;
public class User {
private Integer id;
private String name;
private Integer age;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}

}

映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
<hibernate-mapping>
<class name="com.itheima.domain.User" table="t_user">
<id name="id" column="id"><generator class="native"/></id>
<property name="name" column="name" length="30"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>


核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<!-- 注意,先配置Session- Factory标签 -->
<session-factory>

<!-- 必须配置的参数。共有5个,4大参数和1个数据库方言 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>

<!-- 配置数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 可选配置的参数 -->
<!-- 在控制台显示SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 把在控制台显示的SQL语句格式化输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 生成数据库的表结构
create 穿件Javabean对应的表结构,删除原表,一般实际开发中不会使用
update 开发常用的值。如果没有表结构,创建表结构,存在表结构就不创建,会直接添加数据,如在Javabean里添加info的例子
-->
<property name="hibernate.hbm2dd1.auto">update</property>
<!-- 映射配置文件。引入映射的配置文件 -->
<mapping resource="com/itheima/domain/Customer.hbm.xml"/>

</session-factory>

</hibernate-configuration>
以上是代码部分,测试类就不放了。

首先在网上找了几个可能的问题。
第一,<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>里边的问题,说是数据库引擎方言之类的问题,需要把代码改成<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>,我看了一下,自己原来写的就是这样的,所以问题没有出在这里。
第二,hibernate的版本兼容问题,猜测着不是,我用的是5,应该能兼容之前的例题版本。
第三,说是没有开启自动创建表,或者创建表时赋值错误,也就是下边这行代码
<property name="hibernate.hbm2dd1.auto">update</property>,网上争议的地方时里边应该用update还是什么。我在这里是需要创建一个表结构,可以选用update或者是create,考虑到表后期的使用,肯定是使用update,所以问题不是出在update的值这里。
最后细心观察了一下自己的代码,终于还是找到了错误,比较狗血,错误还是出在这行代码,但是从文档里复制代码的时候复制错了,这样原来的属性是x行这样的
<property name="hibernate.hbm2dd1.auto">update</property>//x
正确的代码应该是y行这样的
<property name="hibernate.hbm2ddl.auto">update</property>//y

没有差别是不是?但是在eclipse里是有差别的。在eclipse里,x行代码中hbm2dd1的1显示是数字1,而正确的应该是y行,hbm2ddl中的l应该是小写的字母L。复制文档的时候就是把1而不是小写的L复制过来了,这才导致了不报错,但是还是不能成功创建表结构的后果。