2011-02-03 12 views
8

persistence.xmlをsrc/test/META-INFフォルダに置くと、エンティティの自動検出はmaven-verifyで機能しません。 persistence.xmlがsrc/main/META-INFフォルダーにある場合、それは機能します。maven-verifyのJPAエンティティの自動検出なし

Eclipseでのテストの実行は、どちらの場合でも有効です。

persistence.xmlがsrc/testフォルダにあるときに、自動検出が動作するようにする方法はありますか?

のpersistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 

    <persistence-unit name="Unit" transaction-type="RESOURCE_LOCAL"> 
    <properties> 
     <!-- Scan for annotated classes and Hibernate mapping XML files --> 
     <property name="hibernate.archive.autodetection" value="class" /> 
    </properties> 
    </persistence-unit> 

</persistence> 

答えて

20

デフォルトで自動検出はpersistence.xmlと同じクラスパス項目のエンティティのために動作します。 <jar-file>要素で設定できます。

<project ...> 
    ... 
    <build> 
     <testResources> 
      <testResource> 
       <directory>src/test/resources</directory> 
       <filtering>true</filtering> 
      </testResource> 
     </testResources> 
    </build> 
</project> 

けれどもI」: - :

persistence.xmlsrc/test/resourcesのフィルタリングリソースを有効

<persistence ...> 
    <persistence-unit ...> 
     <jar-file>${project.build.outputDirectory}</jar-file> 
     ... 
    </persistence-unit> 
</persistence> 

pom.xmlpersistence.xmlsrc/test/resources/META-INFである私は、次のトリックを使用するときに正しい自動検出を有効にするには

あなたのpersistence.xmlが実際に私である場合、それを使用する方法がわかりませんn src/test/META-INF

+1

これはうまくいきます。 (少なくともウィンドウ内では、変数の前にファイル:接頭辞を追加する必要がありました)。どうもありがとうございました!!! – Dominik

+0

トリックは単純な部分でも解決します: ' ../classes' –

0

あなたは春のフレームワークを使用している場合は、PersistenceUnitPostProcessor

CustomPersistenceUnitPostProcessorで、次の操作を行うことができます。

package com.yourpackage.utils.jpa.CustomPersistenceUnitPostProcessor; 

    import java.util.HashSet; 
    import java.util.List; 
    import java.util.Set; 
    import javax.persistence.Entity; 
    import net.sourceforge.stripes.util.ResolverUtil; 
    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 
    import org.springframework.beans.factory.InitializingBean; 
    import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo; 
    import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor; 

    /** 
    * This PersistenceUnitPostProcessor is used to search given package list for JPA 
    * entities and add them as managed entities. By default the JPA engine searches 
    * for persistent classes only in the same class-path of the location of the 
    * persistence.xml file. When running unit tests the entities end up in test-classes 
    * folder which does not get scanned. To avoid specifying each entity in the persistence.xml 
    * file to scan, this post processor automatically adds the entities for you. 
    * 
    */ 
    public class CustomPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor, InitializingBean { 

     private static final Logger log = LoggerFactory.getLogger(CustomPersistenceUnitPostProcessor.class); 

     /** the path of packages to search for persistent classes (e.g. org.springframework). Subpackages will be visited, too */ 
     private List<String> packages; 

     /** the calculated list of additional persistent classes */ 
     private Set<Class<? extends Object>> persistentClasses; 

     /** 
     * Looks for any persistent class in the class-path under the specified packages 
     */ 
     @Override 
     public void afterPropertiesSet() throws Exception { 
      if (packages == null || packages.isEmpty()) 
       throw new IllegalArgumentException("packages property must be set"); 
      log.debug("Looking for @Entity in " + packages); 
      persistentClasses = new HashSet<Class<? extends Object>>(); 
      for (String p : packages) { 
       ResolverUtil<Object> resolver = new ResolverUtil<Object>(); 
       ClassLoader cl = this.getClass().getClassLoader(); 
       log.debug("Using classloader: " + cl); 
       resolver.setClassLoader(cl); 
       resolver.findAnnotated(Entity.class, p); 
       Set<Class<? extends Object>> classes = resolver.getClasses(); 
       log.debug("Annotated classes: " + classes); 
       persistentClasses.addAll(classes); 
      } 
      if (persistentClasses.isEmpty()) 
       throw new IllegalArgumentException("No class annotated with @Entity found in: " + packages); 
     } 

     /** 
     * Add all the persistent classes found to the PersistentUnit 
     */ 
     @Override 
     public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo persistenceUnitInfo) { 
      for (Class<? extends Object> c : persistentClasses) 
       persistenceUnitInfo.addManagedClassName(c.getName()); 
     } 

     public void setPackages(List<String> packages) { 
      this.packages = packages; 
     } 
    } 

春コンフィグ:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="thePersistenceUnitName" /> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> 
    <!-- reference to the XA datasource --> 
    <property name="dataSource" ref="theDataSource" />   

    <property name="persistenceUnitPostProcessors"> 
     <list> 
      <!-- custom implementation to avoid xml entity class declarations --> 
      <bean class="com.yourpackage.utils.jpa.CustomPersistenceUnitPostProcessor"> 
       <property name="packages"> 
        <list value-type="java.lang.String"> 
         <value>com.yourpackage.model</value> 
        </list> 
       </property> 
      </bean> 
     </list> 
    </property> 
</bean> 

のpersistence.xml:

<?xml version="1.0" encoding="UTF-8"?> <persistence 
xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 

    <persistence-unit name="thePersistenceUnitName" transaction-type="RESOURCE_LOCAL"> 

     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <properties>    
      <property name="hibernate.format_sql" value="false" /> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.use_sql_comments" value="false" /> 
      <property name="hibernate.generate_ddl" value="false" /> 
      <property name="hibernate.database_platform" value="org.hibernate.dialect.MySQLInnoDBDialect" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" /> 

    </persistence-unit> 
</persistence> 
関連する問題