2009-08-14 3 views
8
public class LoginTest { 

public static void main(String[] args) { 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("IRCBotPU"); 
    EntityManager em = emf.createEntityManager(); 

    em.getTransaction().begin(); 

    Login lg = new Login(); 
    lg.setPassword("password"); 
    lg.setUserName("Rocky"); 

    em.persist(lg); 
    em.flush(); 

    Login st = em.find(Login.class, lg.getPassword()); 
    System.out.println(st); 

    em.getTransaction().commit(); 

    em.close(); 
    emf.close(); 

} 
} 

Ich bin eine Ausnahme immer wenn ich versuche, diese Klasse zu laufenJPA mit TopLink: Nein META-INF/persistence.xml in Classpath gefunden wurde

javax.persistence.PersistenceException: No Persistence provider for EntityManager named IRCBotPU: 
    No META-INF/persistence.xml was found in classpath. 

META-INF/persistence.xml ist in meinem Klassenpfad. Ich weiß nicht, was der Grund oder die Ausnahme ist.

Die Persistenzbibliothek ist TopLink.

+0

Ja Ich habe die gleiche Struktur – Switch

+2

@oxbow_lakes - Sie könnten es behoben haben :-) Ich habe gerade. – ChssPly76

Antwort

1

persistence.xml sollte nicht in Ihrem Klassenpfad sein; JAR-Datei, die persistence.xml in seinem Ordner META-INF enthält, sollte.

+0

Ja, es ist in META-INF-Ordner – Switch

+0

Was ist der Name der JAR, die eine META-INF/persistence.xml enthält? sagte JAR in Ihrem apps CLASSPATH? –

+0

Nein, es ist keine JAR-Datei Ich benutze NetBeans 6.0, so dass es nur das Paket META-INF erstellt und darin persistence.xml. – Switch

0

Ihre META-INF/persistence.xml Datei wie folgt aussehen sollte:

// <persistence> 
// <persistence-unit name="IRCBotPU"> 
//  <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> 
//  <!-- All persistence classes must be listed --> 
//  <class>entity.Customer</class> 
//  <class>entity.Order</class> 
//  <class>entity.Item</class> 
//  <properties> 
//  <!-- Provider-specific connection properties --> 
//  <property name="toplink.jdbc.driver" value="<database driver>"/> 
//  <property name="toplink.jdbc.url" value="<database url>"/> 
//  <property name="toplink.jdbc.user" value="<user>"/> 
//  <property name="toplink.jdbc.password" value="<password>"/> 
//  <!-- Provider-specific settings --> 
//  <property name="toplink.logging.level" value="INFO"/> 
//  </properties> 
// </persistence-unit> 
// </persistence> 

Ihre Ausdauer-Einheit Name des Attributs in Ihrem persistence.xml nicht den Wert, den Sie in die Persistenz vorbei sind überein .createEntityManagerFactory-Methode. Stellen Sie sicher, dass der Name Ihrer Persistenzeinheit auf "IRCBotPU" eingestellt ist.

+0

persis Tence-Unit-Name ist korrekt – Switch

2

Der Fehler ist etwas irreführend. die XML-Datei selbst sollte nicht im Classpath sein; Der Teil der Nachricht "META-INF/persistence.xml" bedeutet, dass das Verzeichnis, das META-INF/persistence.xml enthält, sein sollte.

Wenn Ihre Festplatte hatte folgende

C: \ Libs \ JPA \ META-INF \ persistence.xml

dann sollten Classpath um diesen

CLASSPATH=c:\libs\JPA 

Wenn META-INF \ Persistence.xml waren in foo.jar enthalten, unter der Annahme, dass sich META-INF/Persistence.xml im Stammordner des JAR befand, sollte Ihr Klassenpfad dieses

CLASSPATH=C:\<path to jar>\foo.jar 
haben

Dies mag offensichtlich oder redundant erscheinen, aber mein Ziel ist es, sicherzustellen, dass wir Äpfel mit Äpfeln vergleichen und der CLASSPATH, zusammen mit Classloading, kann ein lästiges Problem sein.

Also, können Sie Ihren CLASSPATH posten?

+0

Mein Klassenpfad ist auf die genaue Weise festgelegt, die Sie oben erwähnt haben. Aber es wird immer noch nicht funktionieren. – Switch

+0

Enthält das Jar die Implementierung von "IRCBotPU" im Klassenpfad? –

22

hatte ich das gleiche Problem, ich in der WebContent/META-INF meine persistence.xml Datei wurde zu halten, während die JPA-Spezifikation sagt:
die Wurzel der Persistenzeinheit das WEB-INF/classes Verzeichnis ; Die Datei persistence.xml ist daher im Verzeichnis WEB-INF/classes/META-INF
enthalten. Versuchen Sie, persistence.xml unter src/META-INF zu platzieren.

+0

in der folgenden Eclipse arbeitete für mich: src/META-INF/persistence.xml – Falaque

1

Ich habe eine Webanwendung und die folgenden funktionierten gut. Was ich tat, war das META-INF-Verzeichnis mit der persistence.xml in den src/main/resources location hinzufügen [Maven-Projekt]

+0

Danke, das war das einzige, das tatsächlich funktioniert hat. –

0

Ich erstellte einen Ordner namens META-INF unter src und es funktioniert. "Marcosbeirigo" hat es bereits beantwortet. Ich weiß nicht, warum ich diese persistance.xml da drinnen haben muss.Ich habe es unter WebContent/META-INF gestellt und nicht

+0

Da src auf dem Klassenpfad ist, hat es funktioniert. – Ben

2

Wenn Sie intellij oder eine Maven-Projektstruktur verwenden, müssen Sie die gesamte Datei "META-INF/persistance.xml" in die Ressourcen in in (src/Ressourcen), sodass die Datei persistence.xml in den Speicherort "WEB-INF/classes/persistence.xml" verschoben wird.

wenn Sie die Änderungen vornehmen Eclipse oder etwas anderes entsprechend verwenden, so dass es um die Datei WEB-INF/classes/persistence.xml“

alles andere funktionierte nicht für mich zu bewegen.

Verwandte Themen