データベースにMyISAMテーブルとInnoDBテーブルの両方が必要です。hbm2ddlを使用してそれらを作成しています。Hibenrate hbm2ddlを使用して、同じデータベースにMyISAMテーブルとInnoDBテーブルの両方を作成できますか?方言を選択すると、どちらか一方を使わざるを得ないようです。
1 に答える
さて、あなたが書いたように、次を使用すると、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
.