簡體   English   中英

Hibernate配置未列出XML中的所有實體

[英]Hibernate config not list all Entities in XML

當前,在我的hibernate.cfg.xml文件中,我必須將每個單獨的實體列為映射類,以使我的Hibernate能夠選擇該Entity,否則會收到類似references an unknown entity的錯誤。

因此,我大約有20行:

<mapping class="my.com.entity.User"></mapping>
<mapping class="my.com.entity.Address"></mapping>
...

不必每次創建新的Entity時都在XML文件中添加新行,有沒有辦法告訴Hibernate“嘿,只需將my.com.entity包中的所有內容作為Entity引入即可”?

不能。即使使用最新的Hibernate 5版本,您也不能說Hibernate掃描軟件包中的持久性類。

使用Spring

正如@Srini建議的那樣,使用Spring的常用方法。

<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

使用流暢休眠

如果您不想使用Spring,則可以使用fluent-hibernate庫中的EntityScanner (除了該庫之外,您不需要其他jars)。 除此之外,它對於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

v.ladynev建議的兩種方法是好的。 但是,如果您不想自己控制創建ConfigurationSession ,則可以執行以下操作。

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

而且CustomEntityScanner實現類似於以下內容。 您需要做的就是將自定義程序包添加到non-root url中,其他所有內容都是從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();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM