2010-04-12 13 views

Respuesta

6

oficialmente (según la especificación), tiene que especificar todas las clases utilizando el elemento declass. Citando el mapeo-archivo capítulo 6.2.1.6 , jar-file, clase, sin apuntar excluir-clases del JSR-220:

una lista de las clases de persistencia administrada denominada también puede especificarse en lugar de, o además a, los archivos JAR y los archivos de mapeo. Se procesará cualquier anotación de metadatos de asignación que se encuentre en estas clases, o se correlacionarán utilizando los valores predeterminados de la anotación de asignación. El elemento class se usa para mostrar una clase de persistencia administrada. Se debe especificar una lista de todas las clases de persistencia gestionadas nombradas en entornos Java SE para garantizar la portabilidad. Las aplicaciones portátiles Java SE no deben depender de los otros mecanismos descritos aquí para especificar las clases de persistencia administradas de una unidad de persistencia. Los proveedores de persistencia también pueden requerir que el conjunto de clases de entidad y clases que se deben administrar se enumeren por completo en cada uno de los archivos persistence.xml en entornos Java SE.

Ahora, si no te importa estar no es portátil, Hibernate supports usando el elemento jar-file en Java SE (en este caso se necesita una URL absoluta, no útil). Hibernate en realidad también admite autodetección incluso en JSE. Mucho mejor:

<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="foo"> 

    <!-- This is required to be spec compliant, Hibernate however supports auto-detection even in JSE. --> 
    <class>foo.Bar<class> 

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

</persistence> 
2

Hasta donde yo sé, no hay forma de que la clase escanee para que las anotaciones funcionen en esa configuración. Sin embargo, puede señalar explícitamente su archivo persistence.xml en cada clase de entidad.

<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="punit"> 

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

    <jta-data-source>java:/myDS</jta-data-source> 

    <!-- Must be explicit as classes are in separate jar --> 
    <class>com.foo.Bar</class> 
    <class>com.foo.Baz</class> 

    <properties/>  
    </persistence-unit> 

</persistence> 
1

Esto fue un problema con el que me encontré. Un poco más precoz, ya que necesito ejecutar varias jar independientes y parte de una implementación de war.

Existen algunos ataques que parecen girar en torno a múltiples archivos persistence.xml y/o algún intento de apariencia extraña al tratar de hacer referencia al archivo jar utilizando cargadores de recursos de primavera (que no me funcionaron) .

Mi hack personal es usar cargadores de recursos de primavera para resolver un recurso que está en TODOS los archivos de entidad, analizar la referencia de jar de URL y usar un administrador de unidad de persistencia de primavera para insertarlos en la etiqueta jar-file en el virtual persistence.xml

Esto es una forma de hacerlo, pero evita tener múltiples persistence.xml - que técnicamente no es válido.

public class SpringPersistenceUnitManager extends DefaultPersistenceUnitManager implements ApplicationContextAware { 

private final Logger log = LoggerFactory.getLogger(getClass()); 

private ApplicationContext ctx = null; 


private String jarLocationPattern; 

@Override 
protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { 
    super.postProcessPersistenceUnitInfo(pui); 
    try { 
     Resource[] resources = ctx.getResources("classpath*:applicationContext.xml"); 
     for (Resource res : resources) { 
      String resJar = resolveJar(res.getURL()); 
      if (!resJar.equals(pui.getPersistenceUnitRootUrl().toString())) { 
       log.info("Adding " + resJar + " to persistence context"); 
       pui.addJarFileUrl(new URL(resJar)); 
      } 
     } 
    } 
    catch (IOException e) { 
     log.error("error", e); 
    } 
} 

private String resolveJar(URL fileInJar) { 
    String path = fileInJar.getPath(); 
    return path.substring(0, path.indexOf('!')); 
} 

y las cosas contexto de primavera:

<util:properties id="hibernate.properties" location="classpath:hibernate.properties" /> 

<bean id="persistenceUnitManager" class="com.rokksoft.blackice.util.SpringPersistenceUnitManager" 
    p:defaultDataSource-ref="jdbcDataSourcePool" 
/> 

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" lazy-init="true" 
    p:persistenceUnitManager-ref="persistenceUnitManager" 
    p:persistenceUnitName="blackicePU" 
    p:dataSource-ref="jdbcDataSourcePool" 
    p:jpaProperties-ref="hibernate.properties"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
</bean> 

desea filtrar los nombres tarro idealmente sin embargo - tercera tarro de las partes podría tener nada en.

2

Desde mi experiencia - Ahora funciona.

Estamos utilizando:

El> archivo < jar-file-1.0.0.Final.jar hibernación-APP-2,0-api hibernate3.jar 3.6.0.Final: < .../jar-file> sabe cómo buscar rutas relativas, y funciona tanto para archivos jar como para directorios.

estoy usando esta aptitud dos veces:

  • con un tarro sosteniendo mis entidades - que se utilizan en varias aplicaciones. cada aplicación tiene su propia persistence.xml, principalmente para proporcionar diferentes configuraciones de ehcache.
  • Con Junits cuando quiero todas mis pruebas, en todos los demás proyectos dependientes, tengo un único archivo persistence.xml que apuntará a todas las entidades del proyecto de entidades. A continuación, conservamos persistence.xml en el proyecto de entidades en prueba/recursos/META-INF que apunta al directorio Bin de ese proyecto: < archivo jar> file: ../ entities/bin </jar-file>
Cuestiones relacionadas