En el espíritu de la seguridad de tipos asociada con CriteriaQuery, JPA 2.0 también tiene una API para admitir la representación Metamodel de entidades.
¿Alguien está al tanto de una implementación completamente funcional de esta API (para generar el metamodelo en lugar de crear las clases de metamodelo manualmente)? Sería increíble si alguien también conociera los pasos para configurar esto en Eclipse (supongo que es tan simple como configurar un procesador de anotaciones, pero nunca se sabe).
EDITAR: Acabo de tropezar con Hibernate JPA 2 Metamodel Generator . Pero el problema persiste ya que no puedo encontrar ningún enlace de descarga para el jar.
EDICIÓN 2: Ha pasado un tiempo desde que hice esta pregunta, pero pensé en volver y agregar un enlace al proyecto Hibernate JPA Model Generator en SourceForge
Por favor, eche un vistazo a jpa-metamodels-with-maven-example .
Hibernar
org.hibernate.org:hibernate-jpamodelgen
.org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
.Hibernar como dependencia
Hibernar como procesador
OpenJPA
org.apache.openjpa:openjpa
.org.apache.openjpa.persistence.meta.AnnotationProcessor6
.<openjpa.metamodel>true<openjpa.metamodel>
.OpenJPA como dependencia
OpenJPA como procesador
EclipseLink
org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor
.org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
.persistence.xml
.EclipseLink como dependencia
EclipseLink como procesador
DataNucleus
org.datanucleus:datanucleus-jpa-query
.org.datanucleus.jpa.query.JPACriteriaProcessor
.DataNucleus como dependencia
DataNucleus como procesador
fuente
something is recommended
sinIMHO
? No estoy representando en nombre de nadie más.persistence.xml
, ¿no?El soporte JPA 2.0 de Eclipse a través de Dali (que se incluye en "Eclipse IDE para desarrolladores JEE") tiene su propio generador de metamodelos integrado con Eclipse.
Esto debería funcionar en cualquier proveedor de JPA ya que las clases generadas son estándar.
Vea también aquí .
fuente
Para eclipselink, solo la siguiente dependencia es suficiente para generar metamodelo. No se necesita nada más.
fuente
<exclude-unlisted-classes>false</exclude-unlisted-classes>
en persisetence.xmlpersistence.xml
Para Hibernate como proveedor, que es el más común en mi humilde opinión:
En el caso de herramientas de compilación como Gradle, Maven, debe tener el jar del Generador de metamodelos JPA 2 de Hibernate en la ruta de clase y el nivel del compilador> = 1.6, eso es todo lo que necesita para compilar el proyecto y el metamodelo se generará automáticamente.
En el caso de IDE Eclipse 1. vaya a Proyecto-> Propiedades-> Compilador Java-> Procesamiento de anotaciones y habilítelo. 2. Expanda Procesamiento de anotaciones-> Ruta de fábrica-> Agregar jar externo agregue jarra del generador de metamodelo JPA 2 de Hibernate, verifique la jarra recién agregada y diga Aceptar. ¡Limpio y construido!
Enlace Hibernate JPA 2 Metamodel Generator enlace jar desde maven repo https://mvnrepository.com/artifact/org.hibernate/hibernate-jpamodelgen
fuente
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <scope>compile</scope> </dependency> </dependencies>
a pom.xml fue suficiente.Asumamos nuestra aplicación utiliza la siguiente
Post
,PostComment
,PostDetails
, yTag
entidades, que forman un uno-a-muchos, uno-a-uno, y muchos-a-muchos relaciones de la tabla :Cómo generar el metamodelo de criterios JPA
La
hibernate-jpamodelgen
herramienta proporcionada por Hibernate ORM se puede utilizar para escanear las entidades del proyecto y generar el metamodelo de criterios JPA. Todo lo que necesita hacer es agregar lo siguienteannotationProcessorPath
al archivo de configuración demaven-compiler-plugin
Mavenpom.xml
:Ahora, cuando se compila el proyecto, puede ver que en la
target
carpeta, se generan las siguientes clases de Java:Metamodelo de entidad de etiqueta
Si la
Tag
entidad se asigna de la siguiente manera:La
Tag_
clase Metamodel se genera así:Se
SingularAttribute
utiliza para los atributos de entidad básicosid
yname
Tag
JPA.Publicar metamodelo de entidad
La
Post
entidad se asigna así:La
Post
entidad tiene dos atributos básicosid
ytitle
unacomments
colección de uno a muchos , unadetails
asociación de uno a uno y unatags
colección de muchos a muchos .La
Post_
clase Metamodel se genera de la siguiente manera:Los atributos básicos
id
ytitle
, así como ladetails
asociación uno a uno , están representados por unSingularAttribute
tiempo, las coleccionescomments
ytags
están representadas por el JPAListAttribute
.Metamodelo de entidad PostDetails
La
PostDetails
entidad se asigna así:Todos los atributos de la entidad serán representados por el JPA
SingularAttribute
en laPostDetails_
clase Metamodel asociada :Entidad PostComment Metamodel
El
PostComment
se asigna de la siguiente manera:Y todos los atributos de la entidad están representados por el JPA
SingularAttribute
en laPostComments_
clase Metamodel asociada :Uso del metamodelo de criterios JPA
Sin el metamodelo JPA, una consulta de la API de criterios que necesita buscar las
PostComment
entidades filtradas por suPost
título asociado se vería así:Observe que usamos el
post
literal String al crear laJoin
instancia, y usamos eltitle
literal String al hacer referencia alPost
title
.El metamodelo JPA nos permite evitar atributos de entidad de codificación rígida, como se ilustra en el siguiente ejemplo:
O digamos que queremos obtener una proyección DTO mientras filtramos
Post
title
losPostDetails
createdOn
atributos y.Podemos usar el Metamodelo al crear los atributos de unión, así como al construir los alias de la columna de proyección DTO o al hacer referencia a los atributos de entidad que necesitamos filtrar:
¿Guay, verdad?
fuente
Ok, según lo que he leído aquí, lo hice con EclipseLink de esta manera y no necesitaba poner la dependencia del procesador al proyecto, solo como un
annotationProcessorPath
elemento del complemento del compilador.fuente