3

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 を使用して生成されました。マッピングに Hibernate Annotations を使用するように移行しているので、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 に「不活性」パッケージのクラスを除外するように指示できるようにしたいと考えています。そうする方法があるかどうか誰でも知っていますか?

4

4 に答える 4

2

これはうまくいくはずです:

<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>
于 2010-01-27T14:53:52.510 に答える
1

私が最終的に行った解決策は、マップしたいクラスを正確に含む別の Hibernate 構成を作成し、マップされたすべてのクラスを含む他の Hibernate 構成の代わりに、それをエクスポート タスクに使用することでした。

于 2010-01-28T17:25:12.160 に答える
0

hbmddlタグ のupdate属性を試しましたか?

<hbm2ddl update="true" ...

詳細はこちらをご覧ください

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

于 2010-01-26T20:25:18.533 に答える
0

このような状況で、Hibernate にテーブル内のデータを更新させたくない場合は、次のように置き換えることができます。

<class name="FooClass" table="FOO_TABLE"></class>

<class name="Foo" subselect="select * from FOO_TABLE">
  <synchronize table="FOO_TABLE">
</class>

スキーマ エクスポート ツールはそれを無視しますが、書き込みも無視します。少なくとも、それはドキュメントが示唆していることです。

subselect (オプション): 不変で読み取り専用のエンティティをデータベースの副選択にマップします。

Table.isPhysicalTable関数を見て、これを発見しました。もう 1 つの例外である AbstractUnionTables の使用を検討することもできます。

たまたま不変オブジェクトが必要です。

私の使用例は、スキーマ エクスポートを誤って変更するリスクなしに、いくつかの休止状態の管理対象オブジェクトのわずかに異なる形状の不変版をロードしたいということです。したがって、サブセレクトはそれに非常に適しています。

残念ながら、すべてのクエリにその副選択が散らばっており、データベースそれを最適化して取り除くことができますが、データベースの最適化に対する信頼の度合いには正当な理由があります。

于 2015-07-22T01:24:54.190 に答える