Могу ли я создать таблицы MyISAM и InnoDB в одной базе данных с помощью Hibenrate hbm2ddl - PullRequest
3 голосов
/ 01 августа 2010

Мне нужны таблицы MyISAM и таблицы InnoDB в моей базе данных, я использую hbm2ddl для их создания.Могу ли я создать таблицы MyISAM и InnoDB в одной базе данных с помощью Hibenrate hbm2ddl?Кажется, что выбор диалекта заставляет меня использовать один или другой.

1 Ответ

2 голосов
/ 02 августа 2010

Ну, как вы писали, 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.Вспомогательные объекты базы данных .Из документации:

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.

...