Java 将Hibernate指令插入移动到构建时

Java 将Hibernate指令插入移动到构建时,java,performance,hibernate,jpa,orm,Java,Performance,Hibernate,Jpa,Orm,我有一个大约3000个实体的应用程序(我知道它很多,但我不能更改它)。 当应用程序加载时,Hibernate需要几分钟来完成所有指令插入和SessionFactory设置工作。 我想知道是否可以将Hibernate配置为在构建期间对原始类执行指令插入。 通过这种方式,我可以避免额外生成3000个代理类和应用程序启动的巨大开销。 我找到了一些关于Hibernate构建时插装的信息(org.Hibernate.tool.instrument.javassist.InstrumentTask),但不清

我有一个大约3000个实体的应用程序(我知道它很多,但我不能更改它)。 当应用程序加载时,Hibernate需要几分钟来完成所有指令插入和SessionFactory设置工作。
我想知道是否可以将Hibernate配置为在构建期间对原始类执行指令插入。
通过这种方式,我可以避免额外生成3000个代理类和应用程序启动的巨大开销。
我找到了一些关于Hibernate构建时插装的信息(
org.Hibernate.tool.instrument.javassist.InstrumentTask
),但不清楚这是完全替代运行时插装还是只处理Hibernate惰性属性获取机制。

请提供有关如何将代理生成移动到构建时的任何信息。

是的,您可以。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的解决方案。

在互联网上找到了解决方案。很快就试过了,而且似乎奏效了。希望我没有迟到

这个想法是使用maven antrun插件。您需要在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>

maven antrun插件
仪器领域类别
进程类
跑
org.hibernate
冬眠核心
${hibernate.version}
javassist
javassist
${javassist.version}

自Hibernate 4.2.8以来,您可以使用Hibernate enhance maven插件:

<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>

org.hibernate.orm.tooling
hibernate增强maven插件
过程测试资源
增强

我已经看过插件片段,但问题是它是否取代了运行时检测(并将减少加载时间)?在激活构建时检测后,我没有注意到加载时间/内存消耗有任何变化。这是另一个答案的maven版本吗?不是字面上的,我发现了这个页面:。但我将其修改为使用了InstrumentTask的最新版本,并对其进行了记录。