¿Hay alguna manera de reutilizar un jar con entidades anotadas JPA en más de una aplicación SE (como una dependencia)? < jar-file > en persistence.xml no es compatible con entornos SE, entonces, ¿hay alguna otra manera?Desacoplar un jar de entidades JPA de persistence.xml en entorno SE
Respuesta
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 archivospersistence.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>
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>
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.
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>
- 1. EclipseLink JPA - ubicación de persistence.xml
- 2. ¿Está ubicado JPA persistence.xml classpath?
- 3. Sin autodetección de las entidades JPA en maven-verify
- 4. separan entidades JPA de Hibernate específica ajustes
- 5. Leer variables de entorno en el archivo persistence.xml
- 6. ¿Cuál es la ruta correcta para referir un archivo jar a jpa persistence.xml en una aplicación web?
- 7. JPA 2.0, hibernate 3.5, jars y persistence.xml location
- 8. Posible tener entidades JPA inmutables?
- 9. DDL de ingeniero inverso de entidades JPA
- 10. Entidades JPA y/vs DTOs
- 11. Cómo persistir muchas entidades (JPA)
- 12. JPA con TopLink: No META-INF/persistence.xml se encontró en la ruta de clase
- 13. JPA 2.0: Agregar clases de entidad a PersistenceUnit * desde diferentes jar * automáticamente
- 14. 2 entidades JPA en la misma tabla
- 15. Seleccionar no entidades con JPA?
- 16. Guardando muchas entidades en GAE con JPA
- 17. archivo jar para JPA 2.0
- 18. ¿Se requiere persistence.xml cuando se trabaja con Spring e Hibernate?
- 19. Cargando la entidad JPA desde el archivo Jar externo
- 20. Comparar entidades de fecha en los criterios de JPA API
- 21. Configuración de createdBy y updatedBy en entidades JPA automáticamente
- 22. Eclipse + Convertir un proyecto existente en un proyecto JPA
- 23. ¿Cómo "parametrizar" la instancia de la base de datos JPA en persistence.xml?
- 24. configure Hibernate para usar un persistence.xml renombrado
- 25. JPA: consulta que devuelve varias entidades
- 26. persistence.xml con Glassfish 3.1.1
- 27. ¿Maneja elegantemente violaciones de restricciones en el entorno EJB/JPA?
- 28. Hibernate utilizando JPA (entidades anotadas) y liquibase
- 29. Hibernar: entidades con anotaciones de primavera no escaneadas desde jar
- 30. La agrupación de conexiones C3p0 para jpa en persistence.xml no funciona?