17

私は約3000のエンティティを持つアプリケーションを持っています(私はそれがたくさんあることを知っていますが、それを変更することはできません)。アプリケーションがロードされると、HibernateがすべてのインストルメンテーションとSessionFactoryセットアップを実行するのに1分かかります。
ビルド時に元のクラスでインストルメンテーションを実行するようにHibernateを構成できるかどうか疑問に思いました。
このようにして、3000個の追加の生成されたプロキシクラスとアプリケーションの起動時の大きなオーバーヘッドを回避できます。
Hibernateビルドタイムインストルメンテーション(org.hibernate.tool.instrument.javassist.InstrumentTask)に関する情報をいくつか見つけましたが、これがランタイムインストルメンテーションを完全に置き換えるのか、Hibernateレイジープロパティフェッチメカニズムのみを処理するのかは明確ではありません。
プロキシ生成をビルド時間に移動する方法に関する情報をいただければ幸いです。

4

3 に答える 3

12

はい、できます。Hibernate コードには Ant タスクがありますorg.hibernate.tool.instrument.javassist.InstrumentTask

<target name="instrument" depends="compile">
    <taskdef name="instrument" classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
        <classpath refid="<some-ant-path-including-hibernate-core-jar>"/>
        <classpath path="<your-classes-path>"/>
    </taskdef>

    <instrument verbose="true">
        <fileset dir="<your-classes>">
            <include name="*.class"/>
        </fileset>
    </instrument>
</target>

Mavenベースのものもいくつか見ました。

于 2012-10-05T16:12:35.380 に答える
4

Hibernate 4.2.8 以降では、hibernate-enhance-maven-plugin を使用できます。

<build>
    <plugins>
        <plugin>
            <groupId>org.hibernate.orm.tooling</groupId>
            <artifactId>hibernate-enhance-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>process-test-resources</phase>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
于 2014-09-06T19:50:17.930 に答える
3

インターネットで解決策を見つけました。早速試してみたところ、うまくいくようです。遅刻しませんように..

アイデアは、maven-antrun-plugin を使用することです。build/plugins セクションの pom.xml にこれを含める必要があります。

以下の例では、忘れないでください: - ${hibernate.version} と ${javassist.version} を使用しているバージョンに置き換えます。- インクルード ルールを変更して、InstrumentTask をエンティティでのみ実行する

<plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>Instrument domain classes</id>
                    <configuration>
                        <tasks>
                            <taskdef name="instrument"
                                     classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
                                <classpath>
                                    <path refid="maven.dependency.classpath"/>
                                    <path refid="maven.plugin.classpath"/>
                                </classpath>
                            </taskdef>
                            <instrument verbose="true">
                                <fileset dir="${project.build.outputDirectory}">
                                    <include name="**/model/**/*.class"/>
                                </fileset>
                            </instrument>
                        </tasks>
                    </configuration>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-core</artifactId>
                    <version>${hibernate.version}</version>
                </dependency>

                <dependency>
                    <groupId>javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>${javassist.version}</version>
                </dependency>
            </dependencies>
        </plugin>
于 2013-03-22T14:34:27.990 に答える