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

Nic*_*ams 8 spring hibernate jpa hibernate-entitymanager load-time-weaving

我在Spring Framework应用程序中使用Hibernate作为JPA提供程序(我使用它EntityManagerFactory而不是它SessionFactory).我设法让Spring Framework的加载时间编织支持工作,所以我已经超越了这个障碍.

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

Nic*_*ams 25

经过大量阅读代码和调试后,我想出来了.令人遗憾的是,Hibernate ORM文档不包含此信息.(公平地说,Hibernate EntityManager文档确实如此,但它并不容易找到.关于"使用延迟属性获取"Hibernate指令只说"Lazy属性加载需要构建时字节码检测."它没有提到你可以使用运行时检测使用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.

通过这些步骤,我现在在Tomcat中使用Hibernate的运行时实体字节码检测和Spring Framework.