如何在Spring Boot 2 JPA应用程序中选择InnoDB或XtraDB作为MariaDB中的存储引擎



我正在使用Spring Boot 2.0.0.M6和Spring Data JPA开发一个新的应用程序。我使用的是MariaDB v10。下面是我的dev属性文件。

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mariadb://localhost:3306/testdb
spring.datasource.username=user
spring.datasource.password=
spring.jpa.show-sql=true
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
org.hibernate.dialect.Dialect=MariaDB53Dialect
spring.jooq.sql-dialect=MariaDB53Dialect

我得到输出:

Hibernate: create table hibernate_sequence (next_val bigint) engine=MyISAM

我无法更改存储引擎。所有表都是使用存储引擎MyISAM创建的。

我可以使用其他存储引擎手动创建表。但由于某些原因,Spring或Hibernate只能使用MyISAM引擎。

对于纯Hibernate Java应用程序,Hibernate默认使用InnoDB。

信息:HHH000412:休眠核心{5.2.11.Final}

Hibernate:创建表Hibernate_sequence(next_val-bigint)engine=InnoDB

是否有任何方法可以从Spring Boot属性覆盖数据库存储引擎?

如Spring Boot文档中所述,所有以spring.jpa.properties为前缀的属性都会传递到底层JPA提供程序(在本例中为Hibernate),并删除前缀。

配置方言的Hibernate属性是hibernate.dialect,它的值应该是要使用的方言的完全限定类名。在这种情况下,这是org.hibernate.dialect.MariaDB53Dialect

综合以上内容,您可以在application.properties:中设置以下属性

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB53Dialect

有了这一点,您的基于Spring Boot的应用程序将使用MariaDB方言:

2017-11-09 14:18:17.557  INFO 69955 --- [ost-startStop-1] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MariaDB53Dialect

使用Hibernate 5.2.12,如果我在将方言设置为MariaDB:的同时运行MySQLStoredProcedureTest

@RequiresDialect(MariaDB53Dialect.class)
public class MySQLStoredProcedureTest 
extends BaseEntityManagerFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
Person.class,
Phone.class,
};
}

...

}

Post实体映射如下:

@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private String nickName;
private String address;
@Temporal(TemporalType.TIMESTAMP )
private Date createdOn;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
@OrderColumn(name = "order_id")
private List<Phone> phones = new ArrayList<>();
@Version
private int version;
//Getters and setter omitted for brevity
}

当我在MariaDB上运行测试时,Hibernate生成以下模式:

create table Person (
id bigint not null,
address varchar(255),
createdOn datetime(6),
name varchar(255),
nickName varchar(255),
version integer not null,
primary key (id)
) engine=InnoDB

这是因为MariaDB53Dialect扩展了使用InnoDBStorageEngine:的MariaDBDialect

public class MariaDBDialect extends MySQL5Dialect {
public MariaDBDialect() {
super();
}
public boolean supportsRowValueConstructorSyntaxInInList() {
return true;
}
@Override
protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
return InnoDBStorageEngine.INSTANCE;
}
}

因此,在使用hbm2ddl生成模式时,不可能使用MariaDB53Dialect获得MyISAM。

但是,您应该只使用hbm2ddl来生成初始脚本。在生产环境中,您应该使用像FlywayDB这样的工具。

实际上,我们在Hibernate用户指南:中写了这篇文章

尽管自动模式生成对测试非常有用和原型设计目的,在生产环境中使用增量迁移脚本灵活地管理模式。

我们在Hibernate 5.2.8中更改了这一点,所以我认为您使用的是旧版本,否则,无法解释为什么您会在hbm2ddl自动生成的模式中看到MyISAM。

使用检查依赖关系

mvn dependency:tree

并确保您确实在使用Hibernate 5.2.12。

最新更新