Ну, как вы писали, Hibernate будет генерировать таблицы InnoDB, если вы используете MySQL5InnoDBDialect
:
public class MySQL5InnoDBDialect extends MySQL5Dialect {
public boolean supportsCascadeDelete() {
return true;
}
public String getTableTypeString() {
return " ENGINE=InnoDB";
}
public boolean hasSelfReferentialForeignKeyBug() {
return true;
}
}
Использование этого диалекта заставит Hibernate добавить ENGINE=InnoDB
в конце CREATE TABLE
заявления.Но это глобальная настройка, вы не можете настроить это поведение на уровне сущности.
Чтобы использовать hbm2ddl и смешать оба движка таблиц, я бы предложил изменить конкретные таблицы после фактов.Для этого вы можете использовать 5.7.Вспомогательные объекты базы данных .Из документации:
Вспомогательные объекты базы данных позволяют CREATE и DROP произвольных объектов базы данных.В сочетании с инструментами эволюции схемы Hibernate они могут полностью определять пользовательскую схему в файлах отображения Hibernate.Хотя она разработана специально для создания и удаления таких вещей, как триггеры или хранимые процедуры, любая команда SQL, которую можно запустить с помощью метода java.sql.Statement.execute (), является допустимой (например, ALTERs, INSERTS и т. Д.).По существу, существует два режима для определения объектов вспомогательной базы данных:
Первый режим заключается в явном перечислении команд CREATE и DROP в файле отображения:
<hibernate-mapping>
...
<database-object>
<create>CREATE TRIGGER my_trigger ...</create>
<drop>DROP TRIGGER my_trigger</drop>
</database-object>
</hibernate-mapping>
Второй режим - предоставлениеПользовательский класс, который создает команды CREATE и DROP.Этот пользовательский класс должен реализовывать интерфейс org.hibernate.mapping.AuxiliaryDatabaseObject
.
<hibernate-mapping>
...
<database-object>
<definition class="MyTriggerDefinition"/>
</database-object>
</hibernate-mapping>
Кроме того, эти объекты базы данных можно произвольно ограничивать, чтобы они применялись только при использовании определенных диалектов.
<hibernate-mapping>
...
<database-object>
<definition class="MyTriggerDefinition"/>
<dialect-scope name="org.hibernate.dialect.Oracle9iDialect"/>
<dialect-scope name="org.hibernate.dialect.Oracle10gDialect"/>
</database-object>
</hibernate-mapping>
Другим вариантом было бы (ab) использовать функцию Hibernate import.sql для выполнения ALTER
.