2016-05-01 13 views
1

現在、私ののhibernate.cfg.xmlファイルには、Hibernateがエンティティを取得するために、個々のエンティティをマッピングクラスとしてリストする必要があります。 references an unknown entityのように。HibernateコンフィグレーションでXML内のすべてのエンティティが一覧表示されない

だから私は約20これらの行のがあります。代わりにXMLファイルに新しいエンティティが作成されるたびに改行を入れて持つの

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

、「休止状態を指示するが方法ですねえ、エンティティとしてmy.com.entityパッケージからすべてを取得するだけですか?

+0

「[]の要素はpersistence.xmlには必要ですか?](http://stackoverflow.com/questions/1780341/do-i-need-class-elements-in-persistence-xml) –

+0

@ScottSosna - 私は 'persistence.xml'ファイルを使用していません。 ** hibernate.cfg.xmlファイルに ''を何とか使用できますか? – Ascalonian

+0

わからない、しばらくのうちに休止状態の設定ファイルを使用していない、明らかにそのショットを与え、それが動作するかどうかを確認してください。 –

答えて

2

いいえ最後のHibernate 5バージョンであっても、永続クラス用のパッケージをスキャンするためにHibernateと言うことはできません。春

@Sriniが示唆したように、そのためのバネを使用する一般的な方法を使用して

org.springframework.orm.hibernate5org.springframework.orm.hibernate4:Hibernateのバージョンに依存

<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> 

注意あなたがパッケージを使用する必要があります。あなたが春を使用したくない場合は流暢-休止

を使用して

、あなたは(あなたがライブラリを除いて、他のjarファイルを持っている必要はありません)fluent-hibernateライブラリから を使用することができます。これとは別に、Hibernate 5とHibernate 4には、エンティティのスキャン、Hibernate 5の暗黙的なネーミング戦略、ネストされたトランスフォーマーなど、いくつかの便利な機能があります。

休止状態4の場合と休止状態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(); 

は、他のライブラリ

すでに使用している場合を使用してscaに使用できるライブラリnydの例としてReflectionsの場合、エンティティスキャン用のさまざまなライブラリを使用した例:hibernate-scanners-testのテストプロジェクトがあります。

0

v.ladynevによって提案されている2つのアプローチは良好です。ただし、自分でConfigurationSessionを作成することをコントロールしたくない場合は、次の操作を行うことができます。

hibernate-cfg.xmlでは、 <property name="hibernate.archive.scanner" value="com.custom.CustomEntityScanner" />

そしてCustomEntityScanner実装は次のようなものになり、カスタムスキャナを追加する必要があります。あなたはカスタムパッケージをnon-root urlsに追加するだけです。それ以外のものは、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(); 
     } 
    } 
関連する問題