¿Necesito elementos de en persistence.xml?

Tengo un archivo persistance.xml muy simple:

   pl.michalmech.eventractor.domain.User pl.michalmech.eventractor.domain.Address pl.michalmech.eventractor.domain.City pl.michalmech.eventractor.domain.Country       

y funciona.

Pero cuando @Entity elementos de , la aplicación no ve entidades (todas las clases están anotadas con @Entity ).

¿Hay algún mecanismo automático para @Entity clases @Entity ?

Persistence.xml tiene un jar-file que puede usar. Del tutorial de Java EE 5 :

   This unit manages orders and customers. It does not rely on any vendor-specific features and can therefore be deployed to any persistence provider.  jdbc/MyOrderDB MyOrderApp.jar com.widgets.Order com.widgets.Customer   

Este archivo define una unidad de persistencia llamada OrderManagement , que utiliza un origen de datos JTA-aware jdbc/MyOrderDB . El jar-file y class elementos de class especifican clases de persistencia administradas: clases de entidad, clases incrustables y superclases mapeadas. El elemento jar-file especifica los archivos JAR que son visibles para la unidad de persistencia empaquetada que contiene clases de persistencia administradas, mientras que el elemento de class nombra explícitamente las clases de persistencia administradas.

En el caso de Hibernate, eche un vistazo al Capítulo2. Configuración y configuración también para más detalles.

EDITAR: en realidad, si no te importa no cumplir con las especificaciones, Hibernate admite la autodetección incluso en Java SE. Para hacerlo, agregue la propiedad hibernate.archive.autodetection :

          

En el entorno Java SE, por especificación debe especificar todas las clases como lo ha hecho:

Se debe especificar una lista de todas las clases de persistencia gestionadas nombradas en entornos Java SE para garantizar la portabilidad

y

Si no se pretende que las clases de persistencia anotadas contenidas en la raíz de la unidad de persistencia se incluyan en la unidad de persistencia, se debe usar el elemento exclude-unlisted-classes. El elemento exclude-unlisted-classes no está diseñado para su uso en entornos Java SE.

(JSR-000220 6.2.1.6)

En entornos Java EE, no tiene que hacer esto ya que el proveedor escanea las anotaciones por usted.

Extraoficialmente, puede intentar establecer false en su persistence.xml. Este parámetro se establece de manera predeterminada en false en EE y true en SE. Tanto EclipseLink como Toplink lo admiten hasta donde yo sé. Pero no debe confiar en que funcione en SE, de acuerdo con las especificaciones, como se indicó anteriormente.

Puede INTENTAR lo siguiente (puede o no funcionar en entornos SE):

  false      

¿Necesito elementos de clase en persistence.xml?

No, no necesariamente. Así es como lo haces en Eclipse (probado por Kepler):

Haga clic con el botón derecho en el proyecto, haga clic en Propiedades , seleccione JPA , en la casilla Administración de clases de persistencia , seleccione Descubrir clases anotadas automáticamente .

enter image description here

Para aquellos que ejecutan JPA en Spring, desde la versión 3.1 en adelante, puede establecer la propiedad packagesToScan bajo LocalContainerEntityManagerFactoryBean y deshacerse de persistence.xml por completo.

Aquí está el bajo-abajo

para JPA 2+ esto hace el truco

   

escanear todos los flasks en guerra para las clases anotadas @Entity

Hibernate no es compatible con false en SE, (otro cartel menciona 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 Importar 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.

Puede proporcionar la ruta del elemento jar-file a una carpeta con clases comstackdas. Por ejemplo, agregué algo así cuando preparé persistence.xml para algunas pruebas de integración:

  file:../target/classes 

No estoy seguro de si está haciendo algo similar a lo que estoy haciendo, pero estoy generando una carga de Java fuente de 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 el origen de Java y ejecutar Hibernate sobre todas las clases en mi jar de artefacto “base-model” y no especificarlo explícitamente. Estoy agregando “modelo base” como una dependencia para mi componente de hibernación, pero el problema es la etiqueta en persistence.xml solo le permite especificar rutas absolutas.

La forma en que lo solucioné es copiar mi dependencia de jar “modelo base” explícitamente en mi directorio de destino y también quitarle la versión. Entonces, si construyo mi artefacto “base-model”, generaré “base-model-1.0-SNAPSHOT.jar”, el paso copy-resources lo copiará como “base-model.jar”.

Entonces en tu pom para el componente de hibernación:

    org.apache.maven.plugins maven-dependency-plugin 2.5.1   copy-dependencies process-resources  copy-dependencies     base-model true   

Luego llamo al plugin hibernate en la siguiente fase “process-classes”:

    org.codehaus.mojo hibernate3-maven-plugin 2.2   generate-ddl process-classes  hbm2ddl       hbm2java annotationconfiguration /src/main/java    mysql jpaconfiguration true false true mysql-schema.sql    

y finalmente en mi persistence.xml puedo establecer explícitamente la ubicación del contenedor de la siguiente manera:

 target/dependency/base-model.jar 

y agrega la propiedad:

  

No es una solución, sino una pista para quienes usan Spring:

Traté de usar org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean con la configuración persistenceXmlLocation pero con esto tuve que proporcionar los elementos (incluso si persistenceXmlLocation apuntaba a META-INF/persistence.xml ).

Cuando no utilizo persistenceXmlLocation podría omitir estos elementos de .

No estoy seguro de que esta solución esté dentro de las especificaciones, pero creo que puedo compartirla con otras.

árbol de dependencia

my-entities.jar

Contiene clases de entidad solamente. No META-INF/persistence.xml .

my-services.jar

Depende de my-entities . Contiene EJB solo.

my-resources.jar

Depende de my-services . Contiene clases de recursos y META-INF/persistence.xml .

problemas

  • ¿Cómo podemos especificar el elemento en my-resources como el nombre del artefacto postfixed de una dependencia transitoria?
  • ¿Cómo podemos sincronizar el valor del elemento y el de la dependencia transitoria real?

solución

dependencia directa (¿redundante?) y filtrado de recursos

Puse una propiedad y una dependencia en my-resources/pom.xml .

  xyz-SNAPSHOT     ... my-entities ${my-entities.version} compile    ... my-services some.very.sepecific compile   

Ahora prepara persistence.xml para ser filtrado

    ... lib/my-entities-${my-entities.version}.jar ...   

Complemento Maven Enforcer

Con la regla de dependencyConvergence convergencia, podemos asegurar que la versión de my-entities es la misma tanto en directo como transitiva.

  org.apache.maven.plugins maven-enforcer-plugin 1.4.1   enforce       enforce