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

标签 spring hibernate jpa hibernate-entitymanager load-time-weaving

我在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被修复。 LocalContainerEntityManagerFactoryBeansetLoadTimeWeaver方法不会像应有的那样自动调用,因此您必须手动调用它。在@Configuration类中,只需@Inject@Autowire一个LoadTimeWeaver实例,并在创建setLoadTimeWeaver时手动调用LocalContainerEntityManagerFactoryBean即可。

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

关于spring - 如何使用Hibernate JPA和Spring Framework启用加载时间/运行时编织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423019/

相关文章:

java - Spring 3.2 - 将@EnableAsync 添加到@Configuration 类时项目加载失败

spring - Tomcat能否支持多个JDBC连接池?

java - Hibernate 拦截器 - 为什么在 onSave 之后调用 onFlushDirty?

java - Hibernate 重复值

java - java.lang.NoSuchMethodError:org.springframework.core.annotation.AnnotationUtils.isInJavaLangAnnotationPackage(Ljava/lang/annotation/Annotation;)Z

java - 如何在 @PersistenceContext 中提供单元名称的情况下访问实体管理器?

java - 我可以使用 JPA 将对象类型映射到表吗?

java - 无法确定 : java. util.Set 的类型,在表中

spring - 将 SpringSessionBackedSessionRegistry 与 Redis session 存储库一起使用