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 recommendedsinIMHO? 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.xmlPara 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, yTagentidades, 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-jpamodelgenherramienta 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 siguienteannotationProcessorPathal archivo de configuración demaven-compiler-pluginMavenpom.xml:Ahora, cuando se compila el proyecto, puede ver que en la
targetcarpeta, se generan las siguientes clases de Java:Metamodelo de entidad de etiqueta
Si la
Tagentidad se asigna de la siguiente manera:La
Tag_clase Metamodel se genera así:Se
SingularAttributeutiliza para los atributos de entidad básicosidynameTagJPA.Publicar metamodelo de entidad
La
Postentidad se asigna así:La
Postentidad tiene dos atributos básicosidytitleunacommentscolección de uno a muchos , unadetailsasociación de uno a uno y unatagscolección de muchos a muchos .La
Post_clase Metamodel se genera de la siguiente manera:Los atributos básicos
idytitle, así como ladetailsasociación uno a uno , están representados por unSingularAttributetiempo, las coleccionescommentsytagsestán representadas por el JPAListAttribute.Metamodelo de entidad PostDetails
La
PostDetailsentidad se asigna así:Todos los atributos de la entidad serán representados por el JPA
SingularAttributeen laPostDetails_clase Metamodel asociada :Entidad PostComment Metamodel
El
PostCommentse asigna de la siguiente manera:Y todos los atributos de la entidad están representados por el JPA
SingularAttributeen 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
PostCommententidades filtradas por suPosttítulo asociado se vería así:Observe que usamos el
postliteral String al crear laJoininstancia, y usamos eltitleliteral String al hacer referencia alPosttitle.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
PosttitlelosPostDetailscreatedOnatributos 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
annotationProcessorPathelemento del complemento del compilador.fuente