1

这是参考JPA 2.0:自动将实体类添加到 PersistenceUnit *from different jar*Unable to call Hibernate/QueryDSL from another maven subproject

似乎 Hibernate 4 有一种使用 org.hibernate.integrator.spi.Integrator 服务动态加载实体类的好方法。

现在使用 Hibernate 5 时,Integrator 接口的集成方法给了我

public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory,
        SessionFactoryServiceRegistry serviceRegistry)
{

}

其中元数据的类型为 org.hibernate.boot.Metadata

我无法调用 addAnnotatedClass(),也无法获得 Hibernate 4 中的原始配置对象。

我该如何解决这个问题?

我正在使用 Maven 和码头。

我没有使用弹簧(所以请不要提供任何基于弹簧的解决方案)

4

1 回答 1

0

这实际上与我在周末赶上 Hibernate 5 时遇到的问题有关。您可以在最新的 Javadoc for Hibernate 4Configuration中阅读与该类相关的计划更改。获取有关所有已加载实体类(包括注释实体)的信息的新位置是您提到的类。它有一个方法可以返回已知所有实体的实体元数据表示。然而,这是不可变的。MetadatagetEntityBindings()PersistentClassCollection

建议您重新考虑使用Integrator在运行时添加实体绑定。这在过去可能有效,但文档清楚地指出这不是故意的,因为这应该在初始化时完成。和在大多数情况下一旦构建是不可变的MetadataSessionFactoryImplementor因此Integrator的预期目的不是修改这些配置项,而是将它们用作有关如何Service使用SessionFactoryServiceRegistry.

如果你发现Session在运行时配置你的所有带注释的类很烦人,我建议你尝试使用EntityManagerFactory初始化 Hibernate 的方法,因为它更简单,并且使用可以切换到其他一些的标准 JPA 语法供应商,如果你需要的话。这将代表您自动扫描带注释的实体。API 更加简化和有限,但如果您真的需要原生 Hibernate 特定功能的强大功能,可以使用一种访问原生底层 API的方法。

于 2015-10-18T22:07:48.647 回答