真的,如何实现hibernate运行时检测?

发布于 2024-12-21 04:47:03 字数 1670 浏览 1 评论 0原文

从 hibernate 文档中,我们知道在某些情况下,为了使延迟加载工作,我们需要构建时检测:

如何阻止 Hibernate 急切地获取多对一关联对象 一个关联对象

所以我做了以下操作:

    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.3</version>
      <configuration>
      <tasks>
        <taskdef name="instrument" classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
          <classpath>
            <path refid="maven.runtime.classpath" />
            <path refid="maven.plugin.classpath" />
          </classpath>
        </taskdef>
        <instrument verbose="true">
          <fileset dir="target/classes">
            <include name="**/*.class" />
          </fileset>
        </instrument>
      </tasks>
      </configuration>
        <executions>
          <execution>
    <phase>process-classes</phase>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>

      </plugin>

但它给出了错误

java.lang.VerifyError: (class: com/mycompany/dao/UserDaoHibernateImpl$2, method:signature: (Lcom/mycompany/dao/UserDaoHibernateImpl;II)V)期望在堆栈上找到对象/数组,

这肯定是由于上面的检测造成的,因为删除它可以解决问题;网络搜索还表明,这在某种程度上与 javaasist 中的错误以及 spring 和 hibernate 版本之间的冲突有关。

我正在使用 hibernate 3.5.6-Final、Spring 3.0.6-RELEASE

我已经尝试了 javassist 版本的所有组合,并尝试将 javassist 更改为 asm,也有各种版本,但问题仍然存在。

谢谢 杨

from hibernate docs, we know that in certain case, for lazy-loading to work, we need build-time instrumentation:

How to stop Hibernate from eagerly fetching many-to-one associated object
one-associated-object

so I did the following:

    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.3</version>
      <configuration>
      <tasks>
        <taskdef name="instrument" classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
          <classpath>
            <path refid="maven.runtime.classpath" />
            <path refid="maven.plugin.classpath" />
          </classpath>
        </taskdef>
        <instrument verbose="true">
          <fileset dir="target/classes">
            <include name="**/*.class" />
          </fileset>
        </instrument>
      </tasks>
      </configuration>
        <executions>
          <execution>
    <phase>process-classes</phase>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>

      </plugin>

but it gave errors

java.lang.VerifyError: (class: com/mycompany/dao/UserDaoHibernateImpl$2, method: signature: (Lcom/mycompany/dao/UserDaoHibernateImpl;II)V) Expecting to find object/array on stack

this is definitely due to the instrumentation above, since removing it fixes the problem; also websearches also show that this is somehow related to bugs in javaasist and conflicts between spring and hibernate versions.

I'm using hibernate 3.5.6-Final, Spring 3.0.6-RELEASE

I have tried all combinations of javassist versions, and tried changing javassist to asm, with various versions too, but the problem still exists.

Thanks
Yang

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文