JPA2に依存する実装に依存しないMavenモジュールを構築しようとしています。残念ながら、Maven JPA依存関係はJPA1ベースのみです。そのため、EntityManager.detach()メソッドはJPA2オプションのみであるため使用できません。
理想的には、Pomでjavax.persistence依存関係を指定し、アプリ/コンテナーにJPA2実装を提供することを要求できるようにしたいです。残念ながら、そのような依存関係は見つかりません。
この時点でhibernate-jpa-2.0-api 1.0.0.FINALを提供された依存関係として宣言する唯一の選択肢はありますか?
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>
これは非常に古い投稿であることを知っています。実装にとらわれない場合は、代わりに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の依存関係があります。
JPA 2 APIクラスにアクセスするために、EclipseLink Mavenリポジトリーのjavax.persistence
アーティファクト(eclipselink
アーティファクトではなく)を使用します。 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クラスは含まれていません(2つを除く)。提供されているスコープを指定できます。これはEclipseLink JPAプロバイダーにも適用されます(eclipselink
アーティファクトIDにあります)。
javax.persistence
アーティファクトとhibernate-entitymanager
アーティファクトを混合していないため、JPAプロバイダーのEclipseLinkではなくHibernate EntityManagerに依存する別のプロジェクトの依存関係を管理しました。 2番目のプロジェクトの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
依存関係 を使用する副作用を隠すために行われます。親POMで使用して、複数のJava EEへのコンパイル時参照を許可します。 6つのAPIクラス。
これは、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の使用に関してはより優れたジェネリックをサポートしています。
JPA 2.2 APIについては、「公式の」アーティファクトがMaven Centralから入手できます。 この回答 を参照してください。
今日の時点で、最新のものは次のとおりです。
<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>
プロジェクトのpom.xmlファイルにいくつかの依存関係を追加することで、Maven JPA2の依存関係を解決することができました。依存関係のxmlコードについては、以下を参照してください。
Maven Central でディレクトリをドリルダウンして、最新のgroupIdおよびartifactIdのバージョンを見つけました。 persistence.core および persistence.jpa アーティファクトのmetadata.xmlファイルが見つかるまで、ディレクトリツリーをたどっていきました。
注: persistence.jpa への依存は、実際に javax。永続化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>