问题
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 Exception 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 classpath. I don't know what is the reason or this exception.
Persistence library is TopLink.
回答1:
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.
回答2:
if you are using IntelliJ
or a maven project structure you need to place the entire "META-INF/persistence.xml"
file in the in resources(src/resources) folder so that it will move your persistence.xml
file into "WEB-INF/classes/persistence.xml"
location.
if you are using eclipse
or something else makes the changes accordingly so that it will move the file to WEB-INF/classes/persistence.xml
anything else did not work for me.
回答3:
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?
回答4:
persistence.xml
should not be in your classpath; JAR file that contains persistence.xml
in its META-INF folder should.
回答5:
i have a web application and the following worked fine. What i did was add the META-INF directory with the persistence.xml into the src/main/resources location [Maven project]
回答6:
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".
回答7:
I created a folder callled META-INF under src and it works. "marcosbeirigo" answered it already. I do not know why I have to put that persistance.xml in there though. I put it under WebContent/META-INF and did not work
来源:https://stackoverflow.com/questions/1279060/jpa-with-toplink-no-meta-inf-persistence-xml-was-found-in-classpath