it-swarm.com.ru

Как выбрать InnoDB или XtraDB в качестве механизма хранения в MariaDB в приложении Spring Boot 2 JPA

Я занимаюсь разработкой нового приложения с использованием 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: Hibernate Core {5.2.11.Final}

Hibernate: создать таблицу hibernate_sequence (next_val bigint) engine = InnoDB

Есть ли способ переопределить механизм хранения базы данных из свойств Spring Boot?

Спасибо

3
abcdef12

Как описано в документации 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
5
Andy Wilkinson

В Hibernate 5.2.12, если я запускаю MySQLStoredProcedureTest при установке диалекта на MariaDB:

@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 расширяет MariaDBDialect, который использует InnoDBStorageEngine:

public class MariaDBDialect extends MySQL5Dialect {
    public MariaDBDialect() {
        super();
    }

    public boolean supportsRowValueConstructorSyntaxInInList() {
        return true;
    }

    @Override
    protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
        return InnoDBStorageEngine.INSTANCE;
    }
}

Таким образом, невозможно получить MyISAM с MariaDB53Dialect при генерации схемы с помощью hbm2ddl. 

Однако вы должны использовать только hbm2ddl для генерации исходного скрипта. В производственной среде вы должны использовать инструмент как FlywayDB .

Мы на самом деле написали это в Hibernate User Guide :

Хотя автоматическая генерация схемы очень полезна для тестирования и в целях создания прототипов, в производственной среде, это гораздо больше гибкое управление схемой с использованием сценариев инкрементной миграции.

Мы изменили это в Hibernate 5.2.8 , поэтому я полагаю, что вы используете более старую версию, в противном случае нет никакого объяснения, почему вы увидите MyISAM в вашей автоматически сгенерированной схеме hbm2ddl.

Проверьте зависимости, используя:

mvn dependency:tree

и убедитесь, что вы действительно используете Hibernate 5.2.12.

0
Vlad Mihalcea