我正在尝试构建一个依赖于JPA2的实现不可知的maven模块。不幸的是,唯一的Maven JPA依赖项是基于JPA1的,因此,我不能使用EntityManager.detach()方法,因为它只是JPA2选项。
理想情况下,我希望能够在我的Pom中指定我的javax.persistence依赖项,并要求app / container提供JPA2实现。不幸的是,我找不到任何这样的依赖。
此时我唯一的选择是将hibernate-jpa-2.0-api 1.0.0.FINAL声明为提供的依赖项吗?
答案 0 :(得分:44)
我知道这是一篇相当古老的帖子,如果你想从实现中不可知,那么你应该使用Java EE API依赖。
只需添加到您的POM:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>${jee.version}</version>
<scope>provided</scope>
</dependency>
$ {jee.version}是您所需的Java EE版本。我目前正在使用7.0。它具有所有EJB,JPA和JSF API依赖项。
答案 1 :(得分:38)
Hibernate JPA 2类(javax.persistence ...)在这里:
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
答案 2 :(得分:10)
我使用EclipseLink Maven存储库中的javax.persistence
工件(而不是eclipselink
工件)来访问JPA 2 API类。 POM的片段包括:
<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&nf=1&file=/rt/eclipselink/maven.repo</url>
</repository>
...
</repositories>
...
</project>
javax.persistence
工件包含所有API类,没有EclipseLink类(除了两个),允许您指定提供的范围;这甚至适用于EclipseLink JPA提供程序(位于eclipselink
工件ID中)。
我没有将javax.persistence
工件与hibernate-entitymanager
工件混合在一起,这就是我为另一个依赖于Hibernate EntityManager而不是EclipseLink的项目管理依赖关系的JPA提供程序。第二个项目的POM的片段如下所示:
<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>
我确实在其他项目中将依赖范围从provided
更改为test
,以确保单元测试在类路径中具有JPA提供程序。这主要是为了掩盖使用javaee-api
dependency的副作用,我在父POM中使用它来允许编译时引用几个Java EE 6 API类。
答案 3 :(得分:4)
这是EclipseLink中JPA2最相关的官方API:
<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>
与Hibernates API不同,它来自官方规范,并且在使用Criteria API时支持更好的泛型。
答案 4 :(得分:3)
对于JPA 2.2 API,maven central提供了“官方”工件,请参阅this answer。
答案 5 :(得分:0)
截至今天,我认为最新的一个是:
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
这是你在maven中使用JPA的方法:
<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>
答案 6 :(得分:0)
我能够通过在项目的pom.xml文件中添加几个依赖项来解决我的Maven JPA2依赖关系。请参阅下面的依赖项的xml代码。
通过在Maven Central上向下钻取目录,我找到了最新的groupId和artifactId版本。我刚走过目录树,直到找到persistence.core和persistence.jpa工件的metadata.xml文件。
注意:对persistence.jpa的依赖性实际上是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>