带有TopLink的JPA:在类路径中找不到META-INF / persistence.xml

时间:2009-08-14 17:20:00

标签: java jpa persistence classpath toplink

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

}
}

当我尝试运行此类

时,我遇到了异常
javax.persistence.PersistenceException: No Persistence provider for EntityManager named IRCBotPU:  
   No META-INF/persistence.xml was found in classpath.

META-INF / persistence.xml在我的类路径中。我不知道是什么原因或这个例外。

持久性库是TopLink。

7 个答案:

答案 0 :(得分:22)

我有同样的问题,我将我的persistence.xml文件保存在WebContent / META-INF目录中,而jpa规范说:
持久性单元的根目录是WEB-INF / classes目录;因此,persistence.xml文件包含在WEB-INF / classes / META-INF目录
尝试将persistence.xml放在src / META-INF下。

答案 1 :(得分:3)

如果您使用IntelliJ或maven项目结构,则需要将整个"META-INF/persistence.xml"文件放在资源(src / resources)文件夹中,以便它移动persistence.xml将文件存入"WEB-INF/classes/persistence.xml"位置。

如果您使用eclipse或其他内容进行相应更改,则会将文件移至WEB-INF/classes/persistence.xml

其他任何事都不适合我。

答案 2 :(得分:2)

该错误有点误导。 XML文件本身应该在类路径中;消息中标有“META-INF / persistence.xml”的部分表示包含META-INF / persistence.xml 的目录应

如果你的硬盘有以下

C:\库\ JPA \ META-INF \ persistence.xml中

那么你的类路径应该包含这个

CLASSPATH=c:\libs\JPA

如果META-INF \ Persistence.xml包含在foo.jar中,假设META-INF / Persistence.xml位于jar的根文件夹中,那么你的类路径应该有这个

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

这似乎是显而易见或多余的,但我的目标是确保我们将苹果与苹果进行比较,CLASSPATH以及类加载可能是一个可以解决的问题。

那么,你可以发布你的CLASSPATH吗?

答案 3 :(得分:1)

persistence.xml不应该在你的类路径中;在其META-INF文件夹中包含persistence.xml的JAR文件应该是。

答案 4 :(得分:1)

我有一个Web应用程序,以下工作正常。我所做的是将带有persistence.xml的META-INF目录添加到src / main / resources位置[Maven项目]

答案 5 :(得分:0)

您的META-INF / persistence.xml文件应如下所示:

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

persistence.xml中的persistence-unit的name属性与传递给Persistence.createEntityManagerFactory方法的值不匹配。确保持久性单元名称设置为“IRCBotPU”。

答案 6 :(得分:0)

我在src下创建了一个名为META-INF的文件夹,它可以工作。 “marcosbeirigo”已经回答了。我不知道为什么我必须把那个persistance.xml放在那里。我把它放在WebContent / META-INF下并且不起作用