#概要
JPAで「No Persistence provider for EntityManager named XXX」が発生したときの対処方法について記載します。
#対象読者
Eclipse初心者
JPA初心者
#サマリ
- persistence.xmlがソースフォルダのMETA-INFフォルダ存在するか確認する
- persistence.xmlの定義内容について確認する
- コードからユニット名を指定していることを確認する
- 依存関係が解決しているか確認する
#persistence.xmlがソースフォルダのMETA-INFフォルダ存在するか確認する
ソースフォルダならどこでも大丈夫ですが、以下が自然かと思います。
src/main/resources/META-INF/persistence.xml
ちなみに、ソースフォルダはEclipseでプロジェクト→右クリック→ビルドパス→ビルドパスの構成→ソースタブで確認できます。
#persistence.xmlの定義内容について確認する
persistence.xmlに必須の定義がない場合、タイトルのエラーが発生することがあります。
以下にサンプルを記載します。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="TestJpaUnit">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.arquillian.example.SampleEntity</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
<property name="javax.persistence.jdbc.user" value="mysql" />
<property name="javax.persistence.jdbc.password" value="mysql" />
</properties>
</persistence-unit>
</persistence>
注意点のみ記載します。
- provider定義は必須です
- class定義はそのユニットで使用するEntityを記載します。
JavaEEサーバでアプリを動かさない場合(バッチとか)は必須です
#コードからユニット名を指定していることを確認する
EntityManagerを取得する際は、persistence.xmlに定義したpersistence-unit nameを指定します。
public class SelectSampleEntity {
@PersistenceContext(unitName="TestJpaUnit")
private EntityManager em;
public void execute(){
List<SampleEntity> resultList = em.createQuery("SELECT e FROM SampleEntity",SampleEntity.class).getResultList();
for(SampleEntity sampleEntity:resultList){
System.out.println(sampleEntity.toString());
}
}
}
#依存関係が解決しているか確認する
上記を行っても No Persistence provider for EntityManager named XXXが出る場合、
persistence.xmlに定義したproviderの依存関係が解決していない可能性があります。
今回の場合は、以下をpom.xmlに追加し、Maven更新を行ってみてください。
<!-- https://mvnrepository.com/artifact/org.eclipse.persistence/eclipselink -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.0</version>
</dependency>