在大量阅读代码和调试之后,我明白了这一点。很遗憾 Hibernate ORM 文档没有包含这些信息。(公平地说,Hibernate EntityManager 文档确实如此,但它并不容易找到。关于“使用延迟属性获取”的 Hibernate 说明只说,“延迟属性加载需要构建时字节码检测。”它没有提到您可以使用运行时检测具有 Hibernate EntityManager 属性。)
您必须做的第一件事是将"hibernate.ejb.use_class_enhancer"
JPA 属性设置为"true"
( String
)。这告诉 Hibernate 它可以通过调用实例addTransformer
来使用“应用程序服务器”类转换。PersistenceUnitInfo
“应用服务器”类改造真的是 Spring 的LoadTimeWeaver
. 如果您使用 Spring 的 Java 配置和LocalContainerEntityManagerFactoryBean
,并且 Hibernate 是编译时依赖项,则可以使用AvailableSettings.USE_CLASS_ENHANCER
常量而不是字符串文字"hibernate.ejb.use_class_enhancer"
(这将使其防错字)。
如果您使用 Spring 的 Java 配置,则必须执行一个额外步骤,直到SPR-10856得到修复。LocalContainerEntityManagerFactoryBean
的setLoadTimeWeaver
方法不会像应有的那样自动调用,因此您必须手动调用它。在您的@Configuration
班级中,只是@Inject
或@Autowire
一个LoadTimeWeaver
实例,并setLoadTimeWeaver
在您创建LocalContainerEntityManagerFactoryBean
.
采取这些步骤后,我现在在 Tomcat 中使用 Hibernate 的运行时实体字节码检测和 Spring 框架。