Programing

EntityManager에 대한 지속성 제공자가 없습니다.

crosscheck 2020. 6. 18. 21:19
반응형

EntityManager에 대한 지속성 제공자가 없습니다.


내을 persistence.xml사용하여 동일한 이름을 가진 TopLink세 이하 META-INF디렉토리. 그런 다음 코드를 호출하여 다음을 수행합니다.

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

그러나 다음과 같은 오류 메시지가 나타납니다.

2009-07-21 09 : 22 : 41,018 [main] 오류-agisdb라는 EntityManager에 대한 지속성 공급자가 없습니다.
javax.persistence.PersistenceException : agisdb라는 EntityManager에 대한 지속성 제공자가 없습니다.
    javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:89)에서
    javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:60)에서

여기에 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="agisdb">
        <class>com.agis.livedb.domain.AddressEntity</class>
        <class>com.agis.livedb.domain.TrafficCameraEntity</class>
        <class>com.agis.livedb.domain.TrafficPhotoEntity</class>
        <class>com.agis.livedb.domain.TrafficReportEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

클래스 경로에 있어야합니다. 그러나 위의 오류가 발생했습니다.


<persistence-unit name="agisdb">, 퍼시스턴스 프로 바이더의 이름을 정의 :

<provider>org.hibernate.ejb.HibernatePersistence</provider>

"hibernate-entitymanager.jar"응용 프로그램의 클래스 경로에 넣습니다 .
최신 버전 "hibernate-core.jar"의 경우 더 이상 사용되지 않는 대신 사용해야 합니다.hibernate-entitymanager

Eclipse 와 같은 일부 IDE를 실행하는 경우 :Project Properties -> Java Build Path -> Libraries.

그렇지 않으면 /lib응용 프로그램 에 넣으십시오 .


persistence.xml파일이 디렉토리에 있는지 확인하십시오 .<webroot>/WEB-INF/classes/META-INF


내 pom.xml 파일에서 이것이 필요했습니다.

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>

같은 문제에 직면하여 오랫동안 해결책을 찾지 못했습니다. 내 경우에는 교체하는 데 도움이되었습니다.

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

여기 에서 해결책을 찾았 습니다


어쩌면 <provider>org.hibernate.ejb.HibernatePersistence</provider>항아리에서 다른 공급자를 참조하면서 하나의 공급자를 정의 했을 수도 있습니다 . 저와 함께 일어났습니다 : persistence.xml 공급자는 openjpa 였지만 클래스 경로에서 eclipselink를 사용하고있었습니다. 이 도움을 바랍니다!


또 다른 요점이 있습니다. Eclipse RCP 환경에서이 문제가 발생하면 팩토리 생성을 Persistence.createEntityManagerFactory에서new PersistenceProvider().createEntityManagerFactory

이에 대한 자세한 내용 ECF참조하십시오 .


빠른 조언 :

  • persistence.xml이 클래스 경로에 있는지 확인하십시오.
  • 최대 절전 모드 공급자가 클래스 경로에 있는지 확인하십시오.

독립형 애플리케이션 (JavaEE 외부)에서 JPA를 사용하려면 지속성 제공자를 어딘가에 지정해야합니다. 이것은 내가 아는 두 가지 방법으로 수행 할 수 있습니다.

필자의 경우, maven misconfiguration으로 인해 hibernate-entitymanager jar가 다른 모듈의 일시적인 종속성이더라도 종속성으로 포함되지 않았다는 것을 알았습니다.


Eclipse를 사용하는 경우 제외 패턴이 persistence.xml빌드 경로의 소스 폴더에서 제거되지 않는지 확인하십시오 .

  1. 로 이동 속성 -> 자바 빌드 경로 -> 소스

  2. MyProject/src/main/java -> Excluded: <your_pattern>
    트리 노드 에있는 제외 패턴을 확인하십시오.
  3. 선택적으로 Excluded: (None)노드를 선택 하고 왼쪽에서 편집 ... 버튼을 클릭하여 설정 하십시오 .

코너 케이스 : m2Eclipse를 사용하는 경우 자동으로 리소스 폴더에 제외를 넣습니다. 그런 다음 일식 내에서 테스트를 실행하려고하면 persistence.xml이 없으면이 오류가 발생합니다.


나는 몇 년 동안 파티에 늦었지만 HSQLDB 및 데스크탑 JavaFX 프로그램으로 작업하는 Hibernate 3.5.1을 얻는 동안 같은 예외를 겪었다. 이 스레드의 도움과 많은 시행 착오로 작동하도록했습니다. 다양한 문제에 대해이 오류가 발생하는 것 같습니다.

No Persistence provider for EntityManager named mick

최대 절전 모드 자습서 예제를 작성하려고 시도했지만 Java 10을 사용했기 때문에 쉽게 빌드하고 실행할 수 없었습니다. 나는 그 문제를 해결하는 데 시간을 낭비하고 싶지 않아 포기했습니다. module-info.java 파일 (Jigsaw)을 설정하는 것은 많은 사람들이 아직 발견하지 못한 또 다른 헤어볼입니다.

다소 혼란 스럽습니다. 이들 (아래)이 내 build.gradle 파일에 필요한 유일한 두 파일이라는 것입니다. 어떤 병을 포함시켜야하는지에 대해서는 Hibernate 문서가 명확하지 않다. 엔터티 관리자가 혼동을 일으켜 최신 Hibernate 버전에서 더 이상 필요하지 않으며 javax.persistence-api도 아닙니다. 참고로 Java 10을 사용하고 있으므로 jaxb-api를 포함하여 일부 xml-bind 오류를 해결하고 module-info.java 파일에 java persistence 모듈에 대한 항목을 추가해야했습니다.

Build.gradle

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')

// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Module-info.java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;

최대 절전 모드 5.3.1을 사용하면 아래에서 persistence.xml 파일에 공급자를 지정할 필요가 없습니다. 제공되지 않으면 최대 절전 모드 공급자가 기본적으로 선택됩니다.

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

persistence.xml 파일은 올바른 디렉토리에 있어야합니다.

src/main/resources/META-INF/persistence.xml

Dialect를 검사하는 Intellij 디버거에서 최대 절전 모드 소스 코드를 단계별로 실행하면 persistence.xml 파일의 dialect 속성이 없어서 동일한 예외가 발생했습니다. 나는 이것을 추가했다 (귀하의 DB 유형에 맞는 것을 추가하십시오) :

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

이 후에도 여전히 동일한 예외가 발생했기 때문에 Intellij에서 디버거를 다시 단계별로 실행하면 유지하려는 테스트 엔터티 (간단한 부모-자식 예)에 OneToMany, ManyToOne 관계에 대한 주석이 누락 된 것으로 나타났습니다. 나는 이것을 고쳤고 예외는 사라졌고 엔티티는 계속 유지되었다.

다음은 전체 최종 persistence.xml입니다.

<persistence 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"
         version="2.1">

<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
    <description>
        Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
    </description>

    <!-- Provided in latest release of hibernate
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    -->

    <class>com.micks.scenebuilderdemo.database.Parent</class>
    <class>com.micks.scenebuilderdemo.database.Child</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>

        <property name="javax.persistence.jdbc.url"
                  value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>

        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value=""/>

        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>

</persistence-unit>

</persistence>

아마이 보석에 반나절을 낭비했을 것입니다. 내 조언은 매우 간단하게 시작하는 것입니다.이 예외는 많은 원인이있을 수있는 것처럼 하나 또는 두 개의 필드가있는 단일 테스트 엔터티입니다.


'src'폴더 아래에 persistence.xml 파일을 작성했는지 확인하십시오. 프로젝트 폴더 아래에 생성했으며 이것이 내 문제였습니다.


Maven을 사용하는 경우 META-INF 폴더의 올바른 위치를 찾지 못했을 수 있습니다. 다른 사람들은 폴더 복사에 대해 언급했지만 나를 위해 일한 또 다른 방법은 <resources>태그를 사용하여 Maven에게 폴더를 찾을 위치를 알려주는 것입니다 . 참조 : http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html


엔티티 관리자가 많은 지속성 단위를 가리 키려고 할 때 발생합니다. 다음 단계를 수행하십시오.

  1. 편집기에서 관련 파일을 엽니 다 (IDE에서 프로젝트가 닫힌 경우)
  2. 지속성 및 엔티티 관리자 관련 코드를 모두 삭제하십시오.
  3. 파일을 저장
  4. IDE에서 프로젝트를 엽니 다
  5. 이제 선택한 DB 또는 테이블을 바인딩하십시오.

나는 같은 문제에 직면했지만 EclipseLink 버전 2.5.0에서 .

필자는 반드시 또 다른 jar 파일을 추가하여 문제를 해결했습니다 ( javax.persistence_2.1.0.v201304241213.jar.jar );

항아리 필요 :
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
-하여 jdbc.jar (사용하는 데이터베이스에 따라 다름).

이게 도움이 되길 바란다.


또한이 오류가 있었지만 문제는에서 네임 스페이스 uri였습니다 persistence.xml.

버전 2.1에서 2.0으로 교체 http://xmlns.jcp.org/xml/ns/persistence했습니다 http://java.sun.com/xml/ns/persistence.

지금 작동하고 있습니다.


클래스 경로에 hibernate-entitymanager-x.jar를 추가해야합니다.

Hibernate 4.x에서 jar 파일이 존재하면 persistence.xml 파일에 org.hibernate.ejb.HibernatePersistence를 추가 할 필요가 없습니다.


이 질문에 대한 답변은 이미 있지만, 나를 방해하는 팁을 게시하고 싶었습니다. 이 예외는 이전 오류 후에 발생했습니다. 나는 이것을 얻고 있었다 :

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

새로운 속성 이름을 포함하도록 persistence.xml을 변경했지만

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

더 이상 사용되지 않는 속성 이름에 대한 메시지에 따라 위와 같은 PersistenceException과 다른 모든 예외 문자열이 나타납니다. 내 팁 : 예외 소시지의 시작을 확인하십시오.

Glassfish v2.1.1에는 재배포 또는 배포 취소 및 배포시 어딘가에 캐시되는 persistence.xml이 업데이트되지 않는 버그가있는 것 같습니다. 서버를 다시 시작한 다음 작동했습니다.


OSGi 컨텍스트에서 번들의 MANIFEST.MF에 지속성 단위를 나열해야합니다. 예 :

JPA-PersistenceUnits: my-persistence-unit

그렇지 않으면 JPA 번들은 번들에 지속성 단위가 포함되어 있음을 알 수 없습니다.

http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE를 참조 하십시오 .


클래스 경로에 다음 jar 파일이 필요합니다.

  1. antlr-2.7.6.jar
  2. commons-collections-3.1.jar
  3. dom4j-1.6.1.jar
  4. 최대 절전 모드-주석 -4.0.1.Final.jar
  5. 최대 절전 모드 코어 -4.0.1.Final.jar
  6. hibernate-entitymanager.jar
  7. hibernate-jpa-2.0-api-1.0.0.Final.jar
  8. javassist-3.9.0.jar
  9. jboss-logging-3.1.1.GA.jar
  10. jta-1.1.jar
  11. slf4j-api-1.5.8.jar
  12. xxx-jdbc-driver.jar

방금 META-INF를 src에 복사하고 작동했습니다!


Hibernate 5.2.5
Jar 파일 클래스 경로에 필요하다. 이것은 Hibernate 5.2.5 Final 릴리스의 필수 폴더 안에 있습니다. http://hibernate.org/orm/downloads/ 에서 다운로드 할 수 있습니다 .

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. 동급생 -1.3.0
  4. dom4j-1.6.1
  5. el-api-2.2
  6. geronimo-jta_1.1_spec-1.1.1
  7. 최대 절전 모드-주석-5.0.1. 최종
  8. 최대 절전 모드 -5.2.5. 최종
  9. 최대 절전 모드 -jpa-2.1-api-1.0.0. 최종
  10. jandex-2.0.3. 최종
  11. javassist-3.20.0-GA
  12. javax.inject-1
  13. jboss-interceptor-api_1.1_spec-1.0.0. 베타 1
  14. jboss-logging-3.3.0. 최종
  15. jsr250-api-1.0

xml 파일 만들기 "의 persistence.xml" 의를

YourProject / src / META-INF / persistence.xml

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence 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"
         version="2.1">

<persistence-unit name="sample">

    <class>org.pramod.data.object.UserDetail</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.password" value="root"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="false"/>

        <property name="hibernate.cache.use_second_level_cache" value="false"/>

        <property name="hibernate.archive.autodetection" value="true"/>
    </properties>
</persistence-unit>

  1. <persistence> 태그에 언급 된 정보와 버전은 2.1이어야합니다.
  2. please note the name < persistance-unit > tag, name is mentioned as "sample". This name needs to be used exactly same while loading your

EntityManagerFactor = Persistance.createEntityManagerFactory("sample");. "sample" can be changed as per your naming convention.

Now create a Entity class. with name as per my example UserDetail, in the package org.pramod.data.object

UserDetail.java

package org.pramod.data.object;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user_detail")
public class UserDetail {
    @Id
    @Column(name="user_id")
    private int id;
    @Column(name="user_name")
    private String userName;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }   
    @Override
    public String toString() {
       return "UserDetail [id=" + id + ", userName=" + userName + "]";
    }
}

Now create a class with main method.

HibernateTest.java

package org.pramod.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;

public class HibernateTest {
    private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args)  {
        UserDetail user = new UserDetail();
        user.setId(1);
        user.setUserName("Pramod Sharma");

        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("sample");
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            entityManager.getTransaction().begin();
            entityManager.persist( user );
            entityManager.getTransaction().commit();
            System.out.println("successfull");
            entityManager.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

Output will be

UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull

If there are different names in Persistence.createEntityManagerFactory("JPAService") in different classes than you get the error. By refactoring it is possible to get different names which was in my case. In one class the auto-generated Persistence.createEntityManagerFactory("JPAService")in private void initComponents(), ContactsTable class differed from Persistence.createEntityManagerFactory("JPAServiceExtended") in DBManager class.


Mine got resolved by adding info in persistence.xml e.g. <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> and then making sure you have the library on classpath e.g. in Maven add dependency like

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>

Verify the peristent unit name

<persistence-unit name="com.myapp.model.jpa"
    transaction-type="RESOURCE_LOCAL">    
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);

In my case it was about mistake in two properties as below. When I changed them ‘No Persistence provider for EntityManager named’ disappered.

So you could try test connection with your properties to check if everything is correct.

<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>

Strange error, I was totally confused because of it.

참고URL : https://stackoverflow.com/questions/1158159/no-persistence-provider-for-entitymanager-named

반응형