在Spring jpa 中hibernate 会自动根据实体类建表,但建立的表引擎默认的是MyISAM。那怎么更改默认的表引擎为InnoDB呢?首先看一下你的MySQL方言是怎么设置的。如果你的方言设置的是MySQL55Dialect,那么无需更改, 默认的就是InnoDB。如果你的方言是MySQL5Dialect, 那我们看下代码。
public MySQLDialect() {
super();
String storageEngine = Environment.getProperties().getProperty( Environment.STORAGE_ENGINE );
if ( storageEngine == null ) {
this.storageEngine = getDefaultMySQLStorageEngine();
}
else if( "innodb".equals( storageEngine.toLowerCase() ) ) {
this.storageEngine = InnoDBStorageEngine.INSTANCE;
}
else if( "myisam".equals( storageEngine.toLowerCase() ) ) {
this.storageEngine = MyISAMStorageEngine.INSTANCE;
}
else {
throw new UnsupportedOperationException( "The storage engine '" + storageEngine + "' is not supported!" );
}
...........
从这段代码可以看出, 在创建存储引擎的实例时首先获取环境变量Environment.STORAGE_ENGINE(“hibernate.dialect.storage_engine”), 如果定义了引擎类型,就按照定义的类型生成相应类型的实例。 注意MySQL5Dialect是MySQLDialect的子类。 明白了这段代码, 我们在系统启动时通过-Dhibernate.dialect.storage_engine=innodb定义一下Environment.STORAGE_ENGINE的值就好了。