我在Spring Framework应用程序中将Hibernate用作JPA提供程序(正在使用其EntityManagerFactory
而不是其SessionFactory
)。我设法使Spring Framework的加载时间编织支持起作用,所以我克服了这个障碍。
我需要启用实体上byte[]
和@ManyToOne
属性的延迟加载。我知道如何使用Hibernate的ant任务在构建时对我的实体进行检测(编织),但是我想改为在运行时(加载时编织)对我的实体进行检测。我已经在多个Google搜索结果中看到了对in的引用,但没有启用它的实际说明。我需要设置什么属性来指示Hibernate在运行时可以检测我的实体?
最佳答案
经过大量的代码阅读和调试,我终于明白了。 Hibernate ORM文档不包含此信息真是可惜。 (公平地说,Hibernate EntityManager documentation确实可以,但是并不容易找到。Hibernate instructions on "Using lazy property fetching"只说:“延迟属性加载需要构建时字节码检测。”没有提及您可以将运行时检测与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
即可。
完成这些步骤后,我现在将Hibernate的运行时实体字节码检测与Tomcat中的Spring Framework结合使用。
关于spring - 如何使用Hibernate JPA和Spring Framework启用加载时间/运行时编织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423019/