【问题标题】:JPA with TopLink: No META-INF/persistence.xml was found in classpath带有 TopLink 的 JPA:在类路径中找不到 META-INF/persistence.xml
【发布时间】:2010-11-19 17:26:54
【问题描述】:
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。

【问题讨论】:

  • @oxbow_lakes - 你可以修好它 :-) 我刚刚修好了。

标签: java jpa persistence classpath toplink


【解决方案1】:

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

【讨论】:

  • 在 Eclipse 以下为我工作:src/META-INF/persistence.xml
【解决方案2】:

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

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

其他任何东西都不适合我。

【讨论】:

    【解决方案3】:

    这个错误有点误导。 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 吗?

    【讨论】:

    • 我的类路径设置为您上面提到的确切方式。但它仍然不起作用。
    • 类路径中是否包含“IRCBotPU”实现的Jar?
    【解决方案4】:

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

    【讨论】:

    • 包含 META-INF/persistence.xml 的 JAR 的名称是什么?在您的应用程序 CLASSPATH 中是否说过 JAR?
    • 不,它不是 JAR 文件,我使用的是 NetBeans 6.0,所以它只是创建了 META-INF 包并在其中创建了 persistence.xml。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      您的 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”。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 因为 src 在类路径上,这就是它起作用的原因。
        猜你喜欢
        • 2012-08-21
        • 1970-01-01
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多