一:今天遇到一个诡异的问题,就是关于hibernate3.x实现表结构自动创建,一般我们在用Struts2,Hibernate3.x,Spring3.x搭建框架,尤其在开发阶段都希望在启动Web容器时就可以根据Bean实体自动创建数据表结构,但是今天发现不行,经过查找,最终解决,现在记录一下:
二:首先是实体Bean类:这里我们以User.java为例:
User.java
package net.lampbrother.survey.domain;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
/**
* 用户实体
*/
public class User {
private Integer id;
private String email;
private String password;
private String nickName;
private Date regDate = new Date();
private Set<Survey> surveys = new HashSet<Survey>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
public Set<Survey> getSurveys() {
return surveys;
}
public void setSurveys(Set<Survey> surveys) {
this.surveys = surveys;
}
}
三:接下来是User.hbm.xml文件:
<?xml VERSION="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class NAME="net.lampbrother.survey.domain.User" TABLE="USERS">
<id NAME="id" TYPE="java.lang.Integer">
<COLUMN NAME="USER_ID" />
<generator class="native" />
</id>
<property NAME="email" TYPE="java.lang.String">
<COLUMN NAME="EMAIL" />
</property>
<property NAME="password" TYPE="java.lang.String">
<COLUMN NAME="PASSWORD" />
</property>
<property NAME="nickName" TYPE="java.lang.String">
<COLUMN NAME="NICK_NAME" />
</property>
<property NAME="regDate" TYPE="java.util.Date">
<COLUMN NAME="REG_DATE" />
</property>
</class>
</hibernate-mapping>
四:接下来就是hibernate的配置文件:hibernate.cfg.xml
<?xml VERSION="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<SESSION-factory>
<property NAME="show_sql">TRUE</property>
<property NAME="format_sql">TRUE</property>
<property NAME="hbm2ddl.auto">UPDATE</property>
<!-- 上面的这个不能自动创建表结构 -->
<!-- 根据Bean自动生成数据库表,MySql5.5以后要使用org.hibernate.dialect.MySQL5InnoDBDialect才能创建成功! -->
<!-- <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> -->
<property NAME="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property NAME="jdbc.fetch_size">200</property>
<property NAME="jdbc.batch_size">50</property>
<!-- 加入 Hibernate 映射文件 -->
<mapping resource="net/lampbrother/survey/domain/User.hbm.xml"/>
</SESSION-factory>
</hibernate-configuration>
五:究其原因是:MySQL5.5版本以后就不能用:org.hibernate.dialect.MySQLInnoDBDialect方言来实现自动建表了,必须改用:org.hibernate.dialect.MySQL5InnoDBDialect来实现自动建表。