特定のテーブルを除外して、HibernateのHBM2DDL ANTタスクを取得する方法はありますか?
-
22-09-2019 - |
質問
Hibernateを使用して、テスト用にデータベースを自動的に生成します。インポートには非常に長い時間がかかる静的データを含むテーブルがいくつかあります。過去には、ビルドファイルで次のコードを使用して、データベースを生成しました(ファイルのマッピングから)。
<target name="schema-gen" depends="hibernate-gen">
<taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="project.classpath" />
<schemaexport properties="resources/hibernate.properties" text="false" quiet="false" delimiter=";" output="schema.sql">
<fileset dir="${build.doclets}">
<include name="**/*.hbm.xml" />
<exclude name="**/inert/*.hbm.xml" />
</fileset>
</schemaexport>
</target>
.hbm.xmlファイルは、Xdocletを使用して生成されました。私はマッピングに冬眠注釈を使用することに移行しているので、スキーマを生成するためにhibernatetoolsに移動します。
<target name="annotations-export" depends="hibernate-gen">
<hibernatetool destdir="${basedir}">
<annotationconfiguration configurationfile="${basedir}/resources/hibernate.cfg.xml" propertyfile="${basedir}/resources/hibernate.properties" />
<classpath>
<path refid="project.classpath" />
</classpath>
<hbm2ddl drop="true" create="true" export="true" outputfilename="schema.sql" delimiter=";" format="true" />
</hibernatetool>
</target>
Schemaexportと同じように、HBM2DDLに「Inert」パッケージのクラスを除外するように伝えることができます。そうする方法があるかどうか誰もが知っていますか?
解決 2
私が巻き込まれたソリューションは、マッピングしたいクラスを正確に使用して別のHibernate構成を作成し、マッピングされたすべてのクラスを使用して他のHibernate構成の代わりにエクスポートタスクにそれを使用することでした。
他のヒント
これは機能するはずです:
<target name="annotations-export" depends="hibernate-gen">
<hibernatetool destdir="${basedir}">
<annotationconfiguration configurationfile="${basedir}/resources/hibernate.cfg.xml" propertyfile="${basedir}/resources/hibernate.properties">
<fileset dir="${build.doclets}">
<include name="**/*.class" />
<exclude name="**/inert/*.class" />
</fileset>
</annotationconfiguration>
<classpath>
<path refid="project.classpath" />
</classpath>
<hbm2ddl drop="true" create="true" export="true" outputfilename="schema.sql" delimiter=";" format="true" />
</hibernatetool>
</target>
あなたがこの状況を持っていて、あなたがたまたま冬眠を更新したくない場合 データ テーブルでも、次のものを置き換えることができます。
<class name="FooClass" table="FOO_TABLE"></class>
と
<class name="Foo" subselect="select * from FOO_TABLE">
<synchronize table="FOO_TABLE">
</class>
その後、スキーマエクスポートツールはそれを無視しますが、他の書き込みも無視します。少なくとも、それがドキュメントが示唆していることです。
SubSelect(オプション):データベースSubSelectに不変で読み取り専用のエンティティをマップします。
私はこれを見てこれを発見しました Table.isPhysicalTable
関数。また、他の例外であるAbstractUnionTablesの使用を検討することもできます。
私はたまたま不変のオブジェクトが欲しいです。
私のユースケースは、スキーマエクスポートを誤って変更するリスクなしに、いくつかのHibernate Managedオブジェクトの不変の不変のエディションをわずかに異なってロードしたいということです。したがって、SubSelectはそれに非常に適しています。
残念ながら、それはすべてのクエリをそのサブセレクトに散らばります。 したほうがいい それを最適化することができますが、人々はデータベースの最適化に対するさまざまな信頼を持っています。正当な理由はありません。