9
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。

4

7 回答 7

23

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

于 2010-03-11T00:47:43.827 回答
3

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

如果您正在使用eclipse或其他东西相应地进行更改,以便它将文件移动到WEB-INF/classes/persistence.xml

其他任何事情都对我不起作用。

于 2016-04-04T21:52:16.180 回答
2

这个错误有点误导。XML 文件本身不应位于类路径中;消息中说“META-INF/persistence.xml”的部分意味着包含 META-INF/persistence.xml 的目录应该是。

如果你的硬盘有以下

C:\libs\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 吗?

于 2009-08-14T20:08:57.917 回答
1

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

于 2009-08-14T17:27:59.723 回答
1

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

于 2012-03-06T08:15:41.767 回答
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.createEntityManagerFactory 方法的值不匹配。确保您的持久性单元名称设置为“IRCBotPU”。

于 2009-08-14T17:49:00.477 回答
0

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

于 2013-12-06T16:56:30.283 回答