移动 Hibernate 工具以构建时间

Posted

技术标签:

【中文标题】移动 Hibernate 工具以构建时间【英文标题】:Moving Hibernate instrumentation to build time 【发布时间】:2012-10-05 13:40:07 【问题描述】:

我有一个包含大约 3000 个实体的应用程序(我知道它很多,但我无法更改它)。 当应用程序加载时,Hibernate 需要一分钟来完成所有检测和 SessionFactory 设置工作。 我想知道是否可以将 Hibernate 配置为在构建期间对原始类进行检测。 这样我可以避免 3000 个额外生成的代理类和应用程序启动的巨大开销。 我找到了一些关于 Hibernate 构建时检测 (org.hibernate.tool.instrument.javassist.InstrumentTask) 的信息,但不清楚这是否完全取代了运行时检测或仅处理 Hibernate 惰性属性获取机制。 任何有关如何将代理生成移动到构建时间的信息将不胜感激。

【问题讨论】:

激活构建时间检测后,我没有注意到加载时间/内存消耗有任何变化。 【参考方案1】:

是的,你可以。 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 的。

【讨论】:

我已经看过插件 sn-ps 但问题是它是否会取代运行时检测(并会减少加载时间)?【参考方案2】:

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

【讨论】:

【参考方案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>

【讨论】:

这是另一个答案的 Maven 版本吗? 不是字面意思,我找到了这个页面:tricksdev.blogspot.fr/2009/03/…。但我将其改编为使用了最新版本的 InstrumentTask 并记录下来。

以上是关于移动 Hibernate 工具以构建时间的主要内容,如果未能解决你的问题,请参考以下文章

一对一映射 Hibernate

初始 SessionFactory 创建 failed.java.lang.NoClassDefFoundError: org/hiber nate/cfg/Configuration

Hibernate- Criteria 简易

关于Hibernate的查询

hibernate简单注释(一.1)

Hibernate 5 转换插入问题