Dans l'esprit de la sécurité de type associée à CriteriaQuery, JPA 2.0 dispose également d'une API pour prendre en charge la représentation métamodèle des entités.
Quelqu'un est-il au courant d'une implémentation entièrement fonctionnelle de cette API (pour générer le métamodèle au lieu de créer les classes de métamodèle manuellement)? Ce serait génial si quelqu'un connaît également les étapes de configuration dans Eclipse (je suppose que c'est aussi simple que de configurer un processeur d'annotations, mais on ne sait jamais).
EDIT: Je viens de tomber sur Hibernate JPA 2 Metamodel Generator . Mais le problème persiste car je ne trouve aucun lien de téléchargement pour le bocal.
EDIT 2: Un certain temps est passé depuis que j'ai posé cette question, mais je pensais revenir et ajouter un lien vers le projet Hibernate JPA Model Generator sur SourceForge
Veuillez jeter un œil à jpa-metamodels-with-maven-example .
Hiberner
org.hibernate.org:hibernate-jpamodelgen
.org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
.Hibernate en tant que dépendance
Hibernate en tant que processeur
OpenJPA
org.apache.openjpa:openjpa
.org.apache.openjpa.persistence.meta.AnnotationProcessor6
.<openjpa.metamodel>true<openjpa.metamodel>
.OpenJPA en tant que dépendance
OpenJPA en tant que processeur
EclipseLink
org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor
.org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
.persistence.xml
.EclipseLink en tant que dépendance
EclipseLink en tant que processeur
DonnéesNucleus
org.datanucleus:datanucleus-jpa-query
.org.datanucleus.jpa.query.JPACriteriaProcessor
.DataNucleus en tant que dépendance
DataNucleus en tant que processeur
la source
something is recommended
sansIMHO
? Je ne représente au nom de personne d'autre.persistence.xml
, n'est-ce pas?Le support JPA 2.0 d'Eclipse via Dali (qui est inclus dans «Eclipse IDE for JEE Developers») a son propre générateur de métamodèle intégré à Eclipse.
Cela devrait fonctionner sur n'importe quel fournisseur JPA car les classes générées sont standard.
Voir aussi ici .
la source
Pour eclipselink, seule la dépendance suivante est suffisante pour générer un métamodèle. Rien d'autre n'est nécessaire.
la source
<exclude-unlisted-classes>false</exclude-unlisted-classes>
dans persisetence.xmlpersistence.xml
Pour Hibernate en tant que fournisseur, ce qui est le plus courant à mon humble avis:
Dans le cas d'outils de construction tels que Gradle, Maven, vous devez avoir le jar Hibernate JPA 2 Metamodel Generator dans le chemin de classe et le niveau du compilateur> = 1.6, c'est tout ce dont vous avez besoin pour construire le projet et le métamodèle sera généré automatiquement.
Dans le cas de l'IDE Eclipse 1. allez à Projet-> Propriétés-> Compilateur Java-> Traitement des annotations et activez-le. 2. Développez Annotation Processing-> Factory Path-> Add External Jar ajouter Hibernate JPA 2 Metamodel Generator jar vérifiez le nouveau jar ajouté et dites OK. Nettoyez et construisez terminé!
Lien Lien vers le jar Hibernate JPA 2 Metamodel Generator à partir du dépôt maven https://mvnrepository.com/artifact/org.hibernate/hibernate-jpamodelgen
la source
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <scope>compile</scope> </dependency> </dependencies>
à pom.xml était suffisant.Supposons que notre application utilise les éléments suivants
Post
,PostComment
,PostDetails
et desTag
entités qui forment un à plusieurs, un à un, et plusieurs à plusieurs relations de table :Comment générer le métamodèle de critères JPA
L'
hibernate-jpamodelgen
outil fourni par Hibernate ORM peut être utilisé pour analyser les entités du projet et générer le métamodèle de critères JPA. Tout ce que vous devez faire est d' ajouter ce qui suitannotationProcessorPath
àmaven-compiler-plugin
la Mavenpom.xml
fichier de configuration:Maintenant, lorsque le projet est compilé, vous pouvez voir que dans le
target
dossier, les classes Java suivantes sont générées:Métamodèle d'entité de balise
Si l'
Tag
entité est mappée comme suit:La
Tag_
classe Metamodel est générée comme ceci:Le
SingularAttribute
est utilisé pour les attributs d'entité de baseid
etname
Tag
JPA.Métamodèle d'entité de poste
L'
Post
entité est mappée comme ceci:L'
Post
entité possède deux attributs de base,id
ettitle
une collection un-à-plusieurscomments
, une association un-à-undetails
et une collection plusieurs-à-plusieurstags
.La
Post_
classe Metamodel est générée comme suit:Les attributs de base
id
ettitle
, ainsi que l'association un-à-undetails
, sont représentés par unSingularAttribute
tandis que les collectionscomments
ettags
sont représentées par le JPAListAttribute
.Métamodèle d'entité PostDetails
L'
PostDetails
entité est mappée comme ceci:Tous les attributs d'entité vont être représentés par le JPA
SingularAttribute
dans laPostDetails_
classe Metamodel associée :Métamodèle d'entité PostComment
Le
PostComment
est mappé comme suit:Et, tous les attributs d'entité sont représentés par le JPA
SingularAttribute
dans laPostComments_
classe Metamodel associée :Utilisation du métamodèle de critères JPA
Sans le métamodèle JPA, une requête d'API Criteria qui a besoin de récupérer les
PostComment
entités filtrées par leurPost
titre associé ressemblerait à ceci:Notez que nous avons utilisé le
post
littéral String lors de la création de l'Join
instance et que nous avons utilisé letitle
littéral String lors du référencement duPost
title
.Le métamodèle JPA nous permet d'éviter le codage en dur des attributs d'entité, comme illustré par l'exemple suivant:
Ou, disons que nous voulons récupérer une projection DTO tout en filtrant
Post
title
lesPostDetails
createdOn
attributs et.Nous pouvons utiliser le métamodèle lors de la création des attributs de jointure, ainsi que lors de la construction des alias de colonne de projection DTO ou lors du référencement des attributs d'entité que nous devons filtrer:
Cool, non?
la source
Ok, sur la base de ce que j'ai lu ici, je l'ai fait avec EclipseLink de cette façon et je n'ai pas eu besoin de mettre la dépendance du processeur au projet, uniquement en tant
annotationProcessorPath
qu'élément du plugin du compilateur.la source