Struts2+Spring+Hibernate框架学习过程中的问题
为什么Hibernate配置完成之后,不能自动建表和更新表
大家好,这里是作为一个小白学习ssh框架过程中的一些自己遇到的问题分享,如果大家遇到过同样的问题,欢迎讨论;还有一点题外话就是Struts2和Hibernate这两个框架,现在用的基本比较少,主要是固定用户群体,比如传统行业,银行,电网等等;
首先看一下我的代码
1、第一次Hibernate.cfg.xml的配置文件
<!-- 数据库方言 -->
<property name="hibernate.dialect"> org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 把hibernate执行sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 把生成的sql格式化一下,方便阅读 -->
<property name="hibernate.format_sql">true</property>
<!-- 建表策略 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置文件路径 -->
<mapping resource="com/ftd/wtb/model/User.hbm.xml"/>
2、然后是实体类的映射文件
<class name="com.ftd.wtb.model.User" table="w_user">
<id name="uid" column="uid" type="java.lang.Integer">
<!-- native会根据具体的数据库生成不同的主键生成策略 -->
<generator class="native"></generator>
</id>
<property name="username" type="java.lang.String">
<column name="username"/>
</property>
<property name="password" type="java.lang.String">
<column name="password"/>
</property>
<property name="telephone" type="java.lang.String">
<column name="telephone"/>
</property>
<property name="address" type="java.lang.String">
<column name="address"/>
</property>
</class>
3、最后是实体类
public class User {
private Integer uid;
private String username;
private String password;
private String telephone;
private String address;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
然后问题就来了
程序能编译运行,但是数据库没有表,更别谈更新了
原因
Mysql8.0建表语句不在支持type=“数据库引擎”的语句,而是使用engine=“数据库引擎”的语句,hibernate的默认方言建表使用的仍然是type,所以报错;
Mysql5.0之后将默认的数据库引擎MyISAM改为InnoDB;
解决办法
hibernate方言使用:
org.hibernate.dialect.MySQL5Dialect
org.hibernate.dialect.MySQL8Dialect
org.hibernate.dialect.MySQL5InnoDBDialect
<!-- 数据库方言 -->
<property name="hibernate.dialect"> org.hibernate.dialect.MySQL8Dialect</property>
<!-- 把hibernate执行sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 把生成的sql格式化一下,方便阅读 -->
<property name="hibernate.format_sql">true</property>
<!-- 建表策略 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置文件路径 -->
<mapping resource="com/ftd/wtb/model/User.hbm.xml"/>
就完美解决了不更新表的问题
注意:我这边用的Hibernate版本是5.4.21,mysql版本是8.0.21。
如果有什么不对的地方欢迎大家指正,希望能够帮到大家!