web-dev-qa-db-fra.com

Où puis-je trouver une dépendance JPA2 Maven?

J'essaie de construire un module maven indépendant de l'implémentation qui repose sur JPA2. Malheureusement, la seule dépendance Maven JPA est basée sur JPA1 et, par conséquent, je ne peux pas utiliser la méthode EntityManager.detach () car il s’agit uniquement d’une option JPA2.

Idéalement, j'aimerais pouvoir spécifier ma dépendance javax.persistence dans mon Pom et demander à l'application/conteneur de fournir l'implémentation JPA2. Malheureusement, je ne peux pas trouver une telle dépendance.

Mon seul choix à ce stade est-il de déclarer hibernate-jpa-2.0-api 1.0.0.FINAL comme dépendance fournie?

31
Eric B.

Les classes Hibernate JPA 2 (javax.persistence ...) sont ici:

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <version>1.0.1.Final</version>
</dependency>
38
Gene De Lisa

Je sais que c'est un article assez ancien, si vous voulez rester agnostique depuis l'implémentation, utilisez plutôt la dépendance de l'API Java EE.

Ajoutez simplement à votre POM:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>${jee.version}</version>
    <scope>provided</scope>
</dependency>

Où $ {jee.version} correspond à la version Java EE souhaitée. J'utilise actuellement la version 7.0. Il comporte toutes les dépendances des API EJB, JPA et JSF.

43
ramsvidor

J'utilise l'artefact javax.persistence (et non l'artefact eclipselink) du référentiel EclipseLink Maven pour accéder aux classes de l'API JPA 2. Les extraits de POM incluent:

<project>
    ...
    <dependencies>
        ...
        <dependency>
            <groupId>org.Eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    ...
    <repositories>
        ...
        <repository>
            <id>EclipseLink Repo</id>
            <!-- note that ampersands in this URL are escaped because this is in an 
            xml file - un-escape them to use in browser -->
            <url>http://www.Eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo</url>
        </repository>
    ...
    </repositories>
...
</project>

L'artéfact javax.persistence contient toutes les classes de l'API et aucune des classes EclipseLink (sauf deux), ce qui vous permet de spécifier la portée telle que fournie. cela s'applique même au fournisseur JPA EclipseLink (qui se trouve dans l'ID d'artefact eclipselink).

Je n'ai pas mélangé l'artefact javax.persistence avec l'artefact hibernate-entitymanager. C'est ainsi que j'ai géré la dépendance d'un autre projet qui s'appuie sur Hibernate EntityManager au lieu d'EclipseLink pour le fournisseur JPA. Un extrait du POM du second projet est présenté ci-dessous:

<project>
    <dependencies>
    ...
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.6.5.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    ...
</project>

Je change les portées de dépendance de provided à test dans d'autres projets afin de m'assurer que les tests unitaires auront un fournisseur JPA dans le chemin d'accès aux classes. Ceci est principalement fait pour masquer les effets secondaires de l'utilisation de la dépendance javaee-api , que j'utilise dans le POM parent afin de permettre la compilation de références de temps à plusieurs classes d'API Java EE 6.

10
Vineet Reynolds

Voici l'API la plus pertinente et la plus officielle pour JPA2 d'EclipseLink:

<repositories>
    <repository>
        <url>http://download.Eclipse.org/rt/eclipselink/maven.repo/</url>
        <id>eclipselink</id>
        <layout>default</layout>
        <name>Repository for library EclipseLink (JPA 2.0)</name>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.Eclipse.persistence</groupId>
        <artifactId>javax.persistence</artifactId>
        <version>2.0.3</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Contrairement aux API Hibernates, celles-ci sont issues de la spécification officielle et prennent en charge de meilleurs génériques lorsqu'il s'agit d'utiliser l'API Criteria.

4
kospiotr

Pour l'API JPA 2.2, un artefact "officiel" est disponible auprès de maven central, voir cette réponse .

3
rmuller

À ce jour, je pense que le plus récent est:

<dependency>                                          
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>    
    <version>1.0.0.Final</version>                    
</dependency>

Voici comment utiliser JPA dans un maven: 

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.10.Final</version>
    <scope>runtime</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.2_spec</artifactId>
        </exclusion>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.jboss.logging</groupId>
            <artifactId>jboss-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
0
Koray Tugay

J'ai pu résoudre le problème de dépendance de Maven JPA2 en ajoutant quelques dépendances au fichier pom.xml du projet. Voir ci-dessous pour le code XML des dépendances.
J'ai trouvé les dernières versions de groupId et artifactId en explorant les répertoires dans Maven Central . Je viens de parcourir l’arborescence jusqu’à ce que j’ai trouvé les fichiers metadata.xml du répertoire persistence.core et du répertoire persistence.jpa artefacts.
Note: La dépendance sur persistence.jpa est ce qui amène réellement le javax.persistence jar .

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.1.Final</version>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.Eclipse.persistence</groupId>
        <artifactId>org.Eclipse.persistence.core</artifactId>
        <version>2.6.4</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.Eclipse.persistence</groupId>
        <artifactId>org.Eclipse.persistence.jpa</artifactId>
        <version>2.6.4</version>
        <scope>compile</scope>
    </dependency>
0
A. Rick