114 votes

Comment générer le métamodèle de l'entité JPA ?

Dans l'esprit de la sécurité de type associée à la CriteriaQuery JPA 2.0 dispose également d'une API permettant de supporter Métamodèle la représentation des entités.

Quelqu'un a-t-il connaissance d'une mise en œuvre entièrement fonctionnelle de cette API (pour générer le métamodèle par opposition à la création manuelle des classes du métamodèle) ? Ce serait formidable si quelqu'un connaissait également les étapes de la mise en place de cette API dans Eclipse (je suppose que c'est aussi simple que de configurer un processeur d'annotation, mais on ne sait jamais).

EDIT : Je viens de tomber sur Générateur de métamodèles Hibernate JPA 2 . Mais le problème demeure puisque je ne trouve aucun lien de téléchargement pour le jar.

EDIT 2 : Un certain temps s'est écoulé depuis que j'ai posé cette question, mais j'ai pensé revenir et ajouter un lien vers le site de l Projet de générateur de modèles JPA Hibernate sur SourceForge

91voto

Pascal Thivent Points 295221

Ce serait génial si quelqu'un connaissait également les étapes de la mise en place de ce système dans Eclipse (je suppose que c'est aussi simple que de mettre en place un processeur d'annotation, mais on ne sait jamais).

Oui, c'est ça. Voici les implémentations et les instructions pour les différentes implémentations de JPA 2.0 :

EclipseLink

Hibernate

OpenJPA

DataNucleus


La dernière implémentation d'Hibernate est disponible à l'adresse suivante :

Une ancienne mise en œuvre d'Hibernate est à :

1 votes

Le lien DataNucleus est mort.

1 votes

Le lien vers Hibernate est également mort

51voto

Jin Kwon Points 2191

Veuillez jeter un coup d'œil à jpa-metamodels-with-maven-example .

Hibernate

  • Nous avons besoin org.hibernate.org:hibernate-jpamodelgen .
  • La classe de processeur est org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor .

Hibernate comme dépendance

    <dependency>
      <groupId>org.hibernate.orm</groupId>
      <artifactId>hibernate-jpamodelgen</artifactId>
      <version>${version.hibernate-jpamodelgen}</version>
      <scope>provided</scope>
    </dependency>

Hibernation en tant que processeur

      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <compilerArguments>-AaddGeneratedAnnotation=false</compilerArguments> <!-- suppress java.annotation -->
              <processors>
                <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>
              </processors>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.hibernate.orm</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>${version.hibernate-jpamodelgen}</version>
          </dependency>
        </dependencies>
      </plugin>

OpenJPA

  • Nous avons besoin org.apache.openjpa:openjpa .
  • La classe de processeur est org.apache.openjpa.persistence.meta.AnnotationProcessor6 .
  • OpenJPA semble nécessiter un élément supplémentaire <openjpa.metamodel>true<openjpa.metamodel> .

OpenJPA comme dépendance

  <dependencies>
    <dependency>
      <groupId>org.apache.openjpa</groupId>
      <artifactId>openjpa</artifactId>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <compilerArgs>
            <arg>-Aopenjpa.metamodel=true</arg>
          </compilerArgs>
        </configuration>
      </plugin>
    </plugins>
  </build>

OpenJPA comme processeur

      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <executions>
          <execution>
            <id>process</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <processors>
                <processor>org.apache.openjpa.persistence.meta.AnnotationProcessor6</processor>
              </processors>
              <optionMap>
                <openjpa.metamodel>true</openjpa.metamodel>
              </optionMap>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa</artifactId>
            <version>${version.openjpa}</version>
          </dependency>
        </dependencies>
      </plugin>

EclipseLink

  • Nous avons besoin org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor .
  • La classe de processeur est org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor .
  • EclipseLink nécessite persistence.xml .

EclipseLink comme dépendance

  <dependencies>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
      <scope>provided</scope>
    </dependency>

EclipseLink comme processeur

    <plugins>
      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <processors>
                <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
              </processors>
              <compilerArguments>-Aeclipselink.persistencexml=src/main/resources-${environment.id}/META-INF/persistence.xml</compilerArguments>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>${version.eclipselink}</version>
          </dependency>
        </dependencies>
      </plugin>

DataNucleus

  • Nous avons besoin org.datanucleus:datanucleus-jpa-query .
  • La classe de processeur est org.datanucleus.jpa.query.JPACriteriaProcessor .

DataNucleus en tant que dépendance

  <dependencies>
    <dependency>
      <groupId>org.datanucleus</groupId>
      <artifactId>datanucleus-jpa-query</artifactId>
      <scope>provided</scope>
    </dependency>
  </dependencies>

DataNucleus en tant que processeur

      <plugin>
        <groupId>org.bsc.maven</groupId>
        <artifactId>maven-processor-plugin</artifactId>
        <executions>
          <execution>
            <id>process</id>
            <goals>
              <goal>process</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <processors>
                <processor>org.datanucleus.jpa.query.JPACriteriaProcessor</processor>
              </processors>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.datanucleus</groupId>
            <artifactId>datanucleus-jpa-query</artifactId>
            <version>${version.datanucleus}</version>
          </dependency>
        </dependencies>
      </plugin>

3 votes

Pour être clair, le contenu généré peut être utilisé avec eclipselink, même si vous utilisez hibernate pour le générer, je n'ai pas pu générer le méta-modèle à partir de netbeans 8 et j'ai dû créer un projet de test maven pour générer mon contenu.

0 votes

@ymajoros Est-il interdit, en SO, de dire something is recommended sans IMHO ? Je ne représente pas au nom de quelqu'un d'autre.

1 votes

BTW, voir la réponse de Sorter pour EclipseLink. C'est la configuration que j'utilise depuis des années et elle fonctionne parfaitement. stackoverflow.com/questions/3037593/

23voto

James Points 18355

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èles intégré à Eclipse.

  1. Sélectionnez votre projet dans le Explorateur de paquets
  2. Aller à Propriétés -> JPA dialogue
  3. Sélectionnez le dossier source dans Métamodèle canonique (JPA 2.0) groupe
  4. Cliquez sur Appliquer pour générer des classes de métamodèles dans le dossier source sélectionné

enter image description here

Cela devrait fonctionner avec n'importe quel fournisseur JPA, car les classes générées sont standard.

Voir aussi aquí .

0 votes

Y a-t-il un moyen de lancer vous-même le processus ? Cela ne produit pas le métamodèle de manière fiable pour moi.

8voto

Deepak Mishra Points 1996

Pour eclipselink, seule la dépendance suivante est suffisante pour générer le métamodèle. Rien d'autre n'est nécessaire.

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
        <version>2.5.1</version>
        <scope>provided</scope>
    </dependency>

0 votes

@Barthelomeus votre note est false . EclipseLink 2.5.1+ générera des classes de métamodèles pour les entités non listées également, il suffit de spécifier <exclude-unlisted-classes>false</exclude-unlisted-classes> dans persisetence.xml

0 votes

Notez qu'eclipselink ne générera pas sans persistence.xml

6voto

Andrey Points 2523

D'accord, j'ai trouvé il

Ils l'ont bien caché...

La mise en place est décrite sur Site web d'Hibernate

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X