8

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

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

4

2 回答 2

25

在大量阅读代码和调试之后,我明白了这一点。很遗憾 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"(这将使其防错字)。

如果您使用 Spring 的 Java 配置,则必须执行一个额外步骤,直到SPR-10856得到修复。LocalContainerEntityManagerFactoryBeansetLoadTimeWeaver方法不会像应有的那样自动调用,因此您必须手动调用它。在您的@Configuration班级中,只是@Inject@Autowire一个LoadTimeWeaver实例,并setLoadTimeWeaver在您创建LocalContainerEntityManagerFactoryBean.

采取这些步骤后,我现在在 Tomcat 中使用 Hibernate 的运行时实体字节码检测和 Spring 框架。

于 2013-08-24T22:19:02.320 回答
-1

我有类似的问题。我按照您提到的步骤成功设置了编织器。我使用带有注释的字节伙伴创建了运行时实体。并在运行时加载此类。使用反射创建相同的实例并尝试持久化。但是hibernate抱怨说,

java.lang.IllegalArgumentException: Unknown entity:

我相信我创建的运行时实体没有得到增强,hibernate 也在抱怨。

于 2017-01-20T11:32:53.103 回答