我在Spring Framework应用程序中将Hibernate用作JPA提供程序(我使用其EntityManagerFactory代替其SessionFactory)。我设法让Spring Framework的加载时间编织支持起作用,所以我克服了这个障碍。
EntityManagerFactory
SessionFactory
我需要在实体上启用byte[]和@ManyToOne属性的延迟加载。我了解如何使用Hibernate的ant任务在 构建 时对我的实体进行检测(编织),但是我想改为在 运行时 (加载时编织)对我的实体进行检测。我已经在多个Google搜索结果中看到了对in的引用,但没有启用它的实际说明。我需要设置什么属性来指示Hibernate在运行时可以检测我的实体?
byte[]
@ManyToOne
经过大量的代码阅读和调试,我弄清楚了。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"(这将使其具有抗错字性)。
"hibernate.ejb.use_class_enhancer"
"true"
String
addTransformer
PersistenceUnitInfo
LoadTimeWeaver
LocalContainerEntityManagerFactoryBean
AvailableSettings.USE_CLASS_ENHANCER
如果您使用的是Spring的Java配置,则必须执行其他步骤,直到修复SPR-10856。不会自动调用LocalContainerEntityManagerFactoryBean的setLoadTimeWeaver方法,因此您必须手动调用它。在您的@Configuration课程中,只需创建实例@Inject或实例,然后在创建时手动调用。@Autowire``LoadTimeWeaver``setLoadTimeWeaver``LocalContainerEntityManagerFactoryBean
setLoadTimeWeaver
@Configuration
@Inject
@Autowire``LoadTimeWeaver``setLoadTimeWeaver``LocalContainerEntityManagerFactoryBean
完成这些步骤后,我现在将Hibernate的运行时实体字节码检测与Tomcat中的Spring Framework结合使用。