Hibernate - 字节码增强和字节码注入的区别是什么?

24

我正在使用Hibernate 4.2和构建时字节码插装来解决出现在@OneToOne关系和@Lob上的惰性问题 (https://developer.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one)

你知道以下两者之间的区别吗:

Hibernate字节码插装:http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch20.html#performance-fetching-lazyproperties

Hibernate字节码增强:http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch20.html#bytecode-enhancement

因为在Hibernate文档中,写到:

EnhancementTask旨在完全替代InstrumentTask,同时与InstrumentTask不兼容,因此任何现有的instrumented类都需要重新从源代码构建。

我可以通过使用字节码注入来解决我的问题,但是使用字节码增强却不起作用。您知道为什么吗?

也许这个新功能还没有完全开发好?

感谢您的帮助。

1个回答

5
答案在于字节码增强的方式。让我们看一下两种情况下会发生什么:
1. 字节码插装:在“运行时”向Java类添加字节码。实际上并不是在运行时,而是在Java类的“加载”期间进行。更多细节可以阅读这篇文章
2. 字节码增强:字节码增强可以在运行时或构建时(离线)执行。当在运行时执行增强时,持久化类在加载时被增强。当在离线时执行增强时,则在后编译步骤中增强类文件。
在大多数字节码增强的情况下,它们都是在后编译时完成的。如果你的Hibernate字节码增强也是如此,那么改变代码的明显选择就是字节码插装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接