3

データベースにMyISAMテーブルとInnoDBテーブルの両方が必要です。hbm2ddlを使用してそれらを作成しています。Hibenrate hbm2ddlを使用して、同じデータベースにMyISAMテーブルとInnoDBテーブルの両方を作成できますか?方言を選択すると、どちらか一方を使わざるを得ないようです。

4

1 に答える 1

2

さて、あなたが書いたように、次を使用すると、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 を使用して両方のテーブル エンジンを混在させるには、事実の後で特定のテーブルを ALTER することをお勧めします。これを行うには、 5.7を使用できます。補助データベース オブジェクト。ドキュメントから:

5.7. 補助データベース オブジェクト

補助データベース オブジェクトにより、任意のデータベース オブジェクトの CREATE および DROP が可能になります。Hibernate のスキーマ進化ツールと組み合わせることで、Hibernate マッピング ファイル内でユーザー スキーマを完全に定義することができます。トリガーやストアド プロシージャなどを作成および削除するために特別に設計されていますが、java.sql.Statement.execute() メソッドを介して実行できるすべての SQL コマンドが有効です (たとえば、ALTER、INSERTS など)。補助データベース オブジェクトを定義するには、基本的に次の 2 つのモードがあります。

最初のモードは、マッピング ファイルに CREATE および DROP コマンドを明示的にリストすることです。

<hibernate-mapping>
    ...
    <database-object>
        <create>CREATE TRIGGER my_trigger ...</create>
        <drop>DROP TRIGGER my_trigger</drop>
    </database-object>
</hibernate-mapping>

2 番目のモードは、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>

別のオプションは、 Hibernate の import.sql 機能を (ab) 使用してALTER.

于 2010-08-01T22:09:28.070 に答える