views:

3548

answers:

4

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();

}

}

I'm getting an Exeption when I try to run this class

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

META-INF/persistence.xml is in my class path. I don't know what is the reason or this exception.

Persistence library is TopLink.

A: 

persistence.xml should not be in your classpath; JAR file that contains persistence.xml in its META-INF folder should.

ChssPly76
yes it is in META-INF folder
MMRUser
What is the name of the JAR that contains a META-INF/persistence.xml? Is said JAR in your apps CLASSPATH?
Kelly French
No it's not a JAR file I'm using NetBeans 6.0 so it just creates the package META-INF and inside it persistence.xml.
MMRUser
A: 

Your META-INF/persistence.xml file should look something like this:

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

Your persistence-unit's name attribute in your persistence.xml doesn't match the value you're passing into the Persistence.createEntityManagerFactory method. Make sure that your persistence-unit name is set to "IRCBotPU".

persistence-unit name is correct
MMRUser
A: 

The error is somewhat misleading. the XML file itself should not be in the classpath; the part of the message saying "META-INF/persistence.xml" means that the directory containing META-INF/persistence.xml should be.

If your hard drive had the following

C:\libs\JPA\META-INF\Persistence.xml

then your classpath should include this

CLASSPATH=c:\libs\JPA

If META-INF\Persistence.xml were contained in foo.jar, assuming META-INF/Persistence.xml were located on the root folder of the jar, your classpath should have this

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

This may seem obvious or redundant but my goal is to make sure we're comparing apples to apples and the CLASSPATH, along with classloading, can be a bugger to deal with.

So, can you post your CLASSPATH?

Kelly French
My classpath is set to the exact way that you have mentioned above.But it still won't work.
MMRUser
Is the Jar that contains the implementation of "IRCBotPU" in the classpath?
Kelly French
+1  A: 

I had the same problem, i was keeping my persistence.xml file in the WebContent/META-INF directory, while the jpa specification says:
the root of the persistence unit is the WEB-INF/classes directory; the persistence.xml file is therefore contained in the WEB-INF/classes/META-INF directory
try placing persistence.xml under src/META-INF.

marcos