2013-10-11 20 views
12

Zajmuję się tworzeniem aplikacji JavaSE przy użyciu JPA. Niestety, mam null po wywołaniu: Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);Nie Dostawca trwałości dla EntityManager o nazwie X

Poniżej znajdą Państwo:

  • fragment mojego kodu, który wywołuje EntityManagerFactory i niespodziewanie powraca null
  • My persistence.xml plik
  • Moja struktura projektu

urywek mojego kodu:

public class Main { 
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU"; 
    private static EntityManagerFactory factory; 

    public static void main(String[] args) { 
     // I get null on this line!!! 
     factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 

     EntityManager em = factory.createEntityManager(); 
     // do stuff with entity manager 
     ... 
    } 
} 

Moja persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <class>path.to.package.server.Todo</class> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties>  
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>  
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>  
      <property name="javax.persistence.jdbc.user" value="postgres"/>  
      <property name="javax.persistence.jdbc.password" value="postgres"/>  
     </properties> 
    </persistence-unit> 
</persistence> 

Moja struktura projektu:

This is the structure of my project:

Odpowiedz

13

należy przenieść plik do persistence.xml odpowiednia lokalizacja.

Dokładniej, dodaj plik META-INF/persistence.xml do katalogu głównego folderu źródłowego.

W tym przypadku, po to właściwe położenie: src\main\java\META-INF\persistence.xml

Oto dane: (pobrane od specyfikacji JPA)

A persistence.xml file defines a persistence unit. The persistence.xml file is 
located in the META-INF directory of the root of the persistence unit. 

korzenia jednostki trwałości jest kluczem tutaj.

Jeśli aplikacja non-Java EE

The jar file or directory whose META-INF directory contains the persistence.xml 
file is termed the root of the persistence unit. 

Jeśli jesteś w aplikacji Java EE następujące obowiązują

In Java EE environments, the root of a persistence unit must be one of the following: 
• an EJB-JAR file 
• the WEB-INF/classes directory of a WAR file[80] 
• a jar file in the WEB-INF/lib directory of a WAR file 
• a jar file in the EAR library directory 
• an application client jar file 
11

Szybka rada:

  • Sprawdź, czy persistence.xml jest w twoim classpa th
  • sprawdzenie, czy dostawca hibernacji jest w ścieżce klas

z wykorzystaniem JPA w samodzielnej aplikacji (poza JavaEE), dostawca wytrwałość musi być określona gdzieś.Można to zrobić na dwa sposoby, które znam:

w moim przypadku okazało się, że ze względu na Maven błędna konfiguracja, hiberna: te-entitmenager.jar nie został dołączony jako zależność, nawet jeśli była to przejściowa zależność innego modułu.

Zobacz również odpowiedzi tutaj: No Persistence provider for EntityManager named

+2

hibernacji-entitymanager.jar jest poprawna odpowiedź dla mnie też. –

0

Więc w moim przypadku, wszystko było w ścieżce klasy, ale musiałem dodać

Klasa C = Class.forName ("org.eclipse.persistence.jpa .PersistenceProvider ");

Myślę, że to spowodowało, że PersistenceProvider zarejestruje się z klasami javax. W przeszłości musiałem też zrobić coś podobnego do sterowników JDBC.

1

ja niedawno zmodernizowane NB 8.1 do 8.2, a nagle w obliczu tego problemu i spędził 2 dni łamiąc głowę rozwiązać. Do 8,1 pracowało usuwanie processorpath (wspomniane wyżej przez innych). W wersji 8.2 problem nadal występował.

W końcu znalazłem, że eclipselink.jar brakuje w domyślnej bibliotece EclipseLink (JPA 2.1). Dodałem plik do definicji biblioteki i voila - zaczęło działać!

0

Dont dać JPA zależnościami explicity

 <dependency> 
        <groupId>javax.persistence</groupId> 
        <artifactId>persistence-api</artifactId> 
        <version>1.0.2</version>  
     </dependency> 

Dzięki,
Rahul

Powiązane problemy