Tengo un archivo persistance.xml muy simple:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
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">
<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
<class>pl.michalmech.eventractor.domain.User</class>
<class>pl.michalmech.eventractor.domain.Address</class>
<class>pl.michalmech.eventractor.domain.City</class>
<class>pl.michalmech.eventractor.domain.Country</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
y funciona.
Pero cuando elimino <class>
elementos, la aplicación no ve entidades (todas las clases están anotadas @Entity
).
¿Existe algún mecanismo automático para buscar @Entity
clases?
En el entorno Java SE, por especificación, debe especificar todas las clases como lo hizo:
y
(JSR-000220 6.2.1.6)
En entornos Java EE, no tiene que hacer esto ya que el proveedor busca anotaciones por usted.
Extraoficialmente, puede intentar configurar
<exclude-unlisted-classes>false</exclude-unlisted-classes>
su persistence.xml. Este parámetro está predeterminadofalse
en EE ytrue
en SE. Tanto EclipseLink como Toplink admiten esto, por lo que puedo decir. Pero no debe confiar en que funcione en SE, de acuerdo con las especificaciones, como se indicó anteriormente.Puede PROBAR lo siguiente (puede que funcione o no en entornos SE):
fuente
<exclude-unlisted-classes>false</exclude-unlisted-classes>
no funcionó con WildFly 8.2.1.Final + Hibernate 4.3.7No, no necesariamente. Así es como se hace en Eclipse (probado por Kepler):
Haga clic derecho en el proyecto, haga clic en Propiedades , seleccione JPA , en la gestión de clases de persistencia marque Descubrir clases anotadas automáticamente .
fuente
persistence.xml
que genera Eclipse.Para aquellos que ejecutan JPA en Spring, a partir de la versión 3.1, puede establecer la
packagesToScan
propiedad enLocalContainerEntityManagerFactoryBean
y deshacerse de persistence.xml por completo.Aquí está la verdad
fuente
Puede proporcionar la
jar-file
ruta del elemento a una carpeta con clases compiladas. Por ejemplo, agregué algo así cuando preparé persistence.xml a algunas pruebas de integración:fuente
para JPA 2+ esto funciona
escanee todos los frascos en la guerra en busca de clases @Entity anotadas
fuente
java.lang.IllegalArgumentException: Unable to visit JAR file:
).Hibernate no es compatible
<exclude-unlisted-classes>false</exclude-unlisted-classes>
con SE (otro póster mencionó que esto funciona con TopLink y EclipseLink).Hay herramientas que generarán automáticamente la lista de clases en persistence.xml, por ejemplo, el asistente de importación de esquema de base de datos en IntelliJ. Una vez que tenga las clases iniciales de su proyecto en persistence.xml, debería ser simple agregar / eliminar clases individuales a mano a medida que avanza su proyecto.
fuente
No estoy seguro de si está haciendo algo similar a lo que estoy haciendo, pero estoy generando una carga de fuente Java desde un XSD usando JAXB en un componente separado usando Maven. Digamos que este artefacto se llama "modelo base"
Quería importar este artefacto que contiene la fuente de Java y ejecutar hibernate sobre todas las clases en mi jar de artefacto "modelo base" y no especificar cada uno explícitamente. Estoy agregando "modelo base" como una dependencia para mi componente de hibernación, pero el problema es que la etiqueta en persistence.xml solo le permite especificar rutas absolutas.
La forma en que lo resolví es copiar mi dependencia de jar del "modelo base" explícitamente en mi directorio de destino y también eliminar la versión de la misma. Entonces, mientras que si construyo mi artefacto "modelo base", genera "modelo base-1.0-SNAPSHOT.jar", el paso de copia de recursos lo copia como "modelo base.jar".
Entonces, en su pom para el componente de hibernación:
Luego llamo al complemento de hibernación en la siguiente fase "clases de proceso":
y finalmente en mi persistence.xml puedo establecer explícitamente la ubicación del frasco así:
y agregue la propiedad:
fuente
No es una solución, sino una pista para aquellos que usan Spring:
Traté de usar
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
con la configuración,persistenceXmlLocation
pero con esto tuve que proporcionar los<class>
elementos (incluso si elpersistenceXmlLocation
solo apuntaba aMETA-INF/persistence.xml
).Cuando no los use
persistenceXmlLocation
, podría omitir estos<class>
elementos.fuente
persistenceXmlLocation
propiedad en miLocalContainerEntityManagerFactoryBean
configuración. Pero todas las consultas funcionan incluso si omito los<class>
elementos. Está en una aplicación Spring / Hibernate / Maven. Pero en su sugerencia dice que "Cuando no use persistenceXmlLocation, podría omitir estos elementos <class>". pero es al revés para mí.No estoy seguro de que esta solución esté bajo las especificaciones, pero creo que puedo compartirla con otros.
árbol de dependencia
mis-entidades.jar
Solo contiene clases de entidad. No
META-INF/persistence.xml
.my-services.jar
Depende de
my-entities
. Solo contiene EJB.my-resources.jar
Depende de
my-services
. Contiene clases de recursos yMETA-INF/persistence.xml
.problemas
<jar-file/>
elemento enmy-resources
como el nombre de artefacto posfijado en la versión de una dependencia transitoria?<jar-file/>
valor del elemento y el de la dependencia transitoria real?solución
dependencia directa (¿redundante?) y filtrado de recursos
Pongo una propiedad y una dependencia
my-resources/pom.xml
.Ahora
persistence.xml
prepárate para ser filtradoComplemento Maven Enforcer
Con la
dependencyConvergence
regla, podemos asegurar que lamy-entities
'versión es la misma tanto en directo como en transitivo.fuente
No necesariamente en todos los casos.
Estoy usando Jboss 7.0.8 y Eclipselink 2.7.0. En mi caso, para cargar entidades sin agregar las mismas en persistence.xml, agregué la siguiente propiedad del sistema en Jboss Standalone XML:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
fuente