2009-08-14 14 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(); 

} 
} 

sto ottenendo un'eccezione quando si tenta di eseguire questa classeJPA con TopLink: No META-INF/persistence.xml è stato trovato nel percorso di classe

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

META-INF/persistence.xml è nel mio classpath. Non so qual è la ragione o questa eccezione.

La libreria di persistenza è TopLink.

+0

Sì Ho la stessa struttura – Switch

+2

@oxbow_lakes - Potresti averlo risolto :-) L'ho appena fatto. – ChssPly76

risposta

1

persistence.xml non dovrebbe essere nel classpath; Il file JAR che contiene persistence.xml nella sua cartella META-INF dovrebbe.

+0

sì è nella cartella META-INF – Switch

+0

Qual è il nome del JAR che contiene un META-INF/persistence.xml? ha detto JAR nelle tue app CLASSPATH? –

+0

No, non è un file JAR Sto usando NetBeans 6.0, quindi crea solo il pacchetto META-INF e all'interno di esso persistence.xml. – Switch

0

tuo file META-INF/persistence.xml dovrebbe essere simile a questo:

// <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> 

attributo Nome di persistenza unità nel vostro persistence.xml non corrisponde al valore che stai passando nel Persistenza .createEntityManagerFactory method. Assicurati che il nome dell'unità di persistenza sia impostato su "IRCBotPU".

+0

persis il nome dell'unità di misura è corretto – Switch

2

L'errore è in qualche modo fuorviante. il file XML stesso dovrebbe essere non essere nel classpath; la parte del messaggio che dice "META-INF/persistence.xml" significa che la directory contenente META-INF/persistence.xml deve essere.

Se il disco rigido ha avuto il seguente

C: \ libs \ APP \ META-INF \ persistence.xml

quindi classpath deve includere questo

CLASSPATH=c:\libs\JPA 

Se META-INF \ Persistence.xml era contenuto in foo.jar, supponendo che META-INF/Persistence.xml si trovasse nella cartella principale del jar, il classpath dovrebbe avere questo

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

Questo può sembrare ovvio o ridondante, ma il mio obiettivo è quello di assicurarsi che stiamo confrontando le mele con le mele e CLASSPATH, insieme con il caricamento delle classi, può essere un bugger da affrontare.

Quindi, puoi pubblicare il tuo CLASSPATH?

+0

Il mio classpath è impostato sul modo esatto sopra menzionato. Ma non funzionerà ancora. – Switch

+0

Il Jar contiene l'implementazione di "IRCBotPU" nel classpath? –

22

Ho avuto lo stesso problema, tenevo il mio file persistence.xml nella directory WebContent/META-INF, mentre la specifica JPA dice:
la radice dell'unità di persistenza è la directory/classes WEB-INF ; il file persistence.xml è quindi contenuto nella directory WEB-INF/classes/META-INF
provare a inserire persistence.xml sotto src/META-INF.

+0

nell'eclisse seguente ha funzionato per me: src/META-INF/persistence.xml – Falaque

1

Ho un'applicazione Web e funzionano correttamente. Quello che ho fatto è stato aggiungere la directory META-INF con il persistence.xml nel percorso src/main/resources [progetto Maven]

+0

Grazie, questo è stato l'unico che ha funzionato. –

0

Ho creato una cartella chiamata META-INF sotto src e funziona. "marcosbeirigo" ha già risposto. Non so perché devo mettere quel persistance.xml lì dentro comunque.L'ho messo sotto WebContent/META-INF e non ha funzionato

+0

Poiché src è sul classpath, è per questo che ha funzionato. – Ben

2

se si utilizza intellij o una struttura di progetto maven è necessario posizionare l'intero file "META-INF/persistance.xml" nelle risorse in (src/risorse) in modo da spostare il file persistence.xml in posizione "WEB-INF/classes/persistence.xml".

se si utilizza Eclipse o qualcos'altro apportare le modifiche di conseguenza in modo che possa spostare il file WEB-INF/classes/persistence.xml"

qualsiasi altra cosa non ha funzionato per me.