2011-02-03 18 views
8

Si pongo el archivo persistence.xml en la carpeta src/test/META-INF, la autodetección de las entidades no funciona con maven-verify. Cuando persistence.xml se encuentra en la carpeta src/main/META-INF, funciona.Sin autodetección de las entidades JPA en maven-verify

Ejecución de las pruebas en eclipse funciona en ambos casos.

¿Hay alguna manera de que la autodetección funcione para maven-verify cuando persistence.xml se encuentra en la carpeta 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> 

Respuesta

20

Por defecto detección automática funciona para entidades en el mismo artículo ruta de clases como persistence.xml. Se puede configurar mediante elementos <jar-file>.

Para activar la detección automática correcta cuando persistence.xml está en src/test/resources/META-INF utilizo el siguiente truco:

persistence.xml:

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

pom.xml - habilitar el filtrado recurso para src/test/resources:

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

Aunque' No estoy seguro de cómo usarlo si su persistence.xml es en realidad yo n src/test/META-INF.

+1

Genial, esto funciona bien. (Excepto por lo menos en Windows necesitábamos agregar un archivo: prefijo antes de la variable). ¡¡¡Muchas gracias!!! – Dominik

+0

El truco se resuelve con una pieza simple también: ' ../clases' –

0

Si utiliza Spring Framework se puede hacer lo siguiente con un 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; 
     } 
    } 

primavera Config:

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