如何在Hibernate 5中使用Integrator服务来添加带注释的类

时间:2015-10-03 04:10:47

标签: java hibernate maven jetty hibernate-5.x

这是参考JPA 2.0: Adding entity classes to PersistenceUnit *from different jar* automaticallyUnable to call Hibernate/QueryDSL from another maven subproject

似乎Hibernate 4有一个很好的方法来动态加载实体类 org.hibernate.integrator.spi.Integrator service。

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

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

}

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

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

我如何解决这个问题?

我正在使用maven和码头。

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

1 个答案:

答案 0 :(得分:0)

这实际上与我在周末遇到Hibernate 5时遇到的问题有关。您可以在latest Javadoc for Hibernate 4中了解与Configuration类相关的计划更改。获取所有已加载实体类(包括带注释实体)的信息的新位置是您提到的Metadata类。它有一个getEntityBindings()方法,它将返回已知所有实体的PersistentClass实体元数据表示。但是Collection是不可变的。

建议您重新考虑使用Integrator在运行时添加实体绑定。这可能在过去有效,但文档明确指出不是故意的,因为这应该在初始化时完成。 MetadataSessionFactoryImplementor在构建后大部分是不可变的,因此Integrator的预期目的不是修改这些配置项,而是将它们用作有关信息的信息。如何使用Service配置新的SessionFactoryServiceRegistry集成。

如果您发现将Session配置为在运行时查找所有带注释的类很烦人,我建议您尝试使用EntityManagerFactory方法初始化Hibernate,因为它更多直截了当并使用标准JPA语法,如果需要,可以切换到少数其他提供程序。这将代表您自动扫描带注释的实体。 API更加简化和有限,但是如果你真的需要本机Hibernate特定功能的强大功能,那就有办法access the native underlying API