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