今天在配置Hibernate数据连接池的时候遇到一点小问题,于是就上网搜啊搜,总结了一下,干货摆放如下:
我们在用hibernate框架时,设置配置文件的时候要用到一项属性是数据库方言:
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
但是在MySQL57Dialect这儿有很多版本,如果配置不好就会出现各种错误,都有哪些版本呢?
我收集了一下:
①MySQLDialect
②MySQL5Dialect
③MySQL55Dialect
④MySQL57Dialect
⑤MySQL8Dialect
⑥MySQLInnoDBDialect
⑦MySQLMyISAMDBDialect
首先来看看MySQLInnoDBDialect 和 MySQLMyISAMDBDialect 的区别:
https://blog.csdn.net/lc0817/article/details/52757194
MyISAMySQL引擎不支持外键,所有如果要映射的表里有外键的话,就会创建失败
这两个明白了,那其他的又有什么区别,再看:
MySQLDialect是MySQL5.X之前的版本,其默认的引擎是MyISAM。部分源码如下:
private MySQLStorageEngine storageEngine;
//org.hibernate.dialect.MySQLDialect.getDefaultMySQLStorageEngine()
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
return MyISAMStorageEngine.INSTANCE;
}
//org.hibernate.dialect.MyISAMStorageEngine.getTableTypeString(String)
@Override
public String getTableTypeString(String engineKeyword) {
return String.format( " %s=MyISAM", engineKeyword );
}
可以看到,确实用的是MyISAMySQL引擎;
二、MySQL5Dialect
看一下部分源码:
//org.hibernate.dialect.MySQL5Dialect
public class MySQL5Dialect extends MySQLDialect{}
可以看到,它还是用的MySQLDialect的引擎,所以它依然不支持外键;
三、MySQL55Dialect
先看一下部分源码:
//org.hibernate.dialect.MySQL55Dialect
public class MySQL55Dialect extends MySQL5Dialect {
@Override
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
return InnoDBStorageEngine.INSTANCE;
}
}
//org.hibernate.dialect.InnoDBStorageEngine
public class InnoDBStorageEngine implements MySQLStorageEngine{
public static final MySQLStorageEngine INSTANCE = new InnoDBStorageEngine();
@Override
public String getTableTypeString(String engineKeyword) {
return String.format( " %s=InnoDB", engineKeyword );
}
}
可以看到,虽然它是继承的MySQL5Dialect,但是它的引擎已经改为innoDB了;而且它支持事务操作,;
剩下的 MySQL57Dialect 和 MySQL8Dialect 的还不太清楚,不敢乱发,有时间看下官方文档再解释,一般来说mysql5.x以上的用MySQL55Dialect就可以支持大多数常用操作了。
点个赞,举手之劳~~~