特定のテーブルを除外して、HibernateのHBM2DDL ANTタスクを取得する方法はありますか?

StackOverflow https://stackoverflow.com/questions/2140709

質問

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>

試しましたか アップデート の属性 hbmddl 鬼ごっこ?

<hbm2ddl update="true" ...

見る ここ 詳細については

それはうまくいくはずです

あなたがこの状況を持っていて、あなたがたまたま冬眠を更新したくない場合 データ テーブルでも、次のものを置き換えることができます。

<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はそれに非常に適しています。

残念ながら、それはすべてのクエリをそのサブセレクトに散らばります。 したほうがいい それを最適化することができますが、人々はデータベースの最適化に対するさまざまな信頼を持っています。正当な理由はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top