一尘不染

如何使用Hibernate JPA和Spring Framework启用加载时间/运行时编织

hibernate

我在Spring
Framework应用程序中将Hibernate用作JPA提供程序(我使用其EntityManagerFactory代替其SessionFactory)。我设法让Spring
Framework的加载时间编织支持起作用,所以我克服了这个障碍。

我需要在实体上启用byte[]@ManyToOne属性的延迟加载。我了解如何使用Hibernate的ant任务在 构建
时对我的实体进行检测(编织),但是我想改为在 运行时
(加载时编织)对我的实体进行检测。我已经在多个Google搜索结果中看到了对in的引用,但没有启用它的实际说明。我需要设置什么属性来指示Hibernate在运行时可以检测我的实体?


阅读 254

收藏
2020-06-20

共1个答案

一尘不染

经过大量的代码阅读和调试,我弄清楚了。Hibernate ORM文档不包含此信息真是可惜。(公平地讲,Hibernate
EntityManager文档
可以,但是并不容易找到。有关“使用惰性属性获取”Hibernate指令只说:“惰性属性加载需要构建时字节码检测。”
没有 提及您可以使用 运行时 检测。带有Hibernate EntityManager属性。)

您必须做的第一件事是将"hibernate.ejb.use_class_enhancer"JPA属性设置为"true"String)。这告诉Hibernate,它可以通过调用使用“应用程序服务器”一类变换addTransformerPersistenceUnitInfo实例。“应用服务器”类的转换实际上是Spring的LoadTimeWeaver。如果您使用Spring的Java配置和LocalContainerEntityManagerFactoryBean,并且Hibernate是编译时依赖项,则可以使用AvailableSettings.USE_CLASS_ENHANCER常量而不是字符串字面量"hibernate.ejb.use_class_enhancer"(这将使其具有抗错字性)。

如果您使用的是Spring的Java配置,则必须执行其他步骤,直到修复SPR-10856。不会自动调用LocalContainerEntityManagerFactoryBeansetLoadTimeWeaver方法,因此您必须手动调用它。在您的@Configuration课程中,只需创建实例@Inject或实例,然后在创建时手动调用。@Autowire``LoadTimeWeaver``setLoadTimeWeaver``LocalContainerEntityManagerFactoryBean

完成这些步骤后,我现在将Hibernate的运行时实体字节码检测与Tomcat中的Spring Framework结合使用。

2020-06-20