Hibernate配置不会列出XML中的所有实体

时间:2016-05-01 23:01:26

标签: java hibernate

目前在我的 hibernate.cfg.xml 文件中,我必须将每个单独的实体列为映射类,以便我的Hibernate获取实体,否则我会收到类似{{{}的错误1}}。

所以我有大约20行:

references an unknown entity

每次创建新实体时,不必在XML文件中添加新行,是否有办法告诉Hibernate“嘿,只需将my.com.entity包中的所有内容作为实体提取”?

2 个答案:

答案 0 :(得分:2)

没有。即使使用最后一个Hibernate 5版本,你也不能说Hibernate扫描包的持久化类。

使用Spring

使用Spring的常用方法,正如@Srini建议的那样。

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  <property name="packagesToScan">
    <list>
      <value>my.com.entities</value>
      <value>my.com.other.entities</value>
    </list>
  </property>
</bean>

请注意,您需要使用Hibernate版本包:org.springframework.orm.hibernate5org.springframework.orm.hibernate4

使用fluent-hibernate

如果您不想使用Spring,可以使用 来自EntityScanner库的fluent-hibernate(除了库之外,您不需要其他罐子)。除此之外,它还为Hibernate 5和Hibernate 4提供了一些有用的功能,包括实体扫描,Hibernate 5隐式命名策略,嵌套转换器等。

对于Hibernate 4和Hibernate 5:

Configuration configuration = new Configuration();
EntityScanner.scanPackages("my.com.entities", "my.com.other.entities")
    .addTo(configuration);
SessionFactory sessionFactory = configuration.buildSessionFactory();

使用新的Hibernate 5引导API:

List<Class<?>> classes = EntityScanner
        .scanPackages("my.com.entities", "my.com.other.entities").result();

MetadataSources metadataSources = new MetadataSources();
for (Class<?> annotatedClass : classes) {
    metadataSources.addAnnotatedClass(annotatedClass);
}

SessionFactory sessionFactory = metadataSources.buildMetadata()
    .buildSessionFactory();

使用其他图书馆

如果您已经使用了可用于扫描的库,例如Reflections,则有一个测试项目,其中包含使用各种库进行实体扫描的示例:hibernate-scanners-test

答案 1 :(得分:0)

v.ladynev建议的两种方法都很好。但是,如果您不想自己控制创建ConfigurationSession,则可以执行以下操作。

hibernate-cfg.xml中,您需要添加自定义扫描程序 <property name="hibernate.archive.scanner" value="com.custom.CustomEntityScanner" />

CustomEntityScanner实现如下所示。您需要做的就是将自定义包添加到non-root网址,其他所有内容都是AbstractScannerImpl的副本。

    public class CustomEntityScanner extends AbstractScannerImpl {
        private final ArchiveDescriptorFactory archiveDescriptorFactory;

        public CustomEntityScanner() {
            this(StandardArchiveDescriptorFactory.INSTANCE);
        }

        protected CustomEntityScanner(ArchiveDescriptorFactory archiveDescriptorFactory) {
            this.archiveDescriptorFactory = archiveDescriptorFactory;
        }

        @Override
        public ScanResult scan(ScanEnvironment environment, ScanOptions options, ScanParameters parameters) {
            final ScanResultCollector collector = new ScanResultCollector( environment, options, parameters );
            //this is specific to your implemenation
            List<URL> paths = Lists.newArrayList();
            // ClasspathHelper is from Reflections library.
paths.addAll(ClasspathHelper.forPackage("your.custom.package"));
            environment.getNonRootUrls().addAll(paths);
            inal ArchiveContext context = new ArchiveContextImpl( false, collector );
            for ( URL url : environment.getNonRootUrls() ) {
                final ArchiveDescriptor descriptor = buildArchiveDescriptor( url, false );
                descriptor.visitArchive( context );
            }

            if ( environment.getRootUrl() != null ) {
                final ArchiveContext context = new ArchiveContextImpl( true, collector );
                final ArchiveDescriptor descriptor = buildArchiveDescriptor( environment.getRootUrl(), true );
                descriptor.visitArchive( context );
            }

            return collector.toScanResult();
        }
    }