【问题标题】:No Persistence provider for EntityManager named X没有名为 X 的 EntityManager 的持久性提供程序
【发布时间】:2013-10-19 19:27:06
【问题描述】:

我正在使用 JPA 开发 JavaSE 应用程序。不幸的是,我在致电后得到nullPersistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

您会在下面找到:

  • 我的代码的 sn-p 调用 EntityManagerFactory 并意外返回 null
  • 我的persistence.xml 文件
  • 我的项目结构

我的代码片段:

public class Main {
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU";
    private static EntityManagerFactory factory;

    public static void main(String[] args) {
        // I get null on this line!!!
       factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

       EntityManager em = factory.createEntityManager();
       // do stuff with entity manager
       ...
    }
}

我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <class>path.to.package.server.Todo</class>
      <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties>       
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>       
            <property name="javax.persistence.jdbc.url"  value="jdbc:postgresql://localhost:5432/test"/>       
            <property name="javax.persistence.jdbc.user" value="postgres"/>       
            <property name="javax.persistence.jdbc.password" value="postgres"/>       
        </properties>
  </persistence-unit>
</persistence>

我的项目结构:

【问题讨论】:

    标签: java jakarta-ee jpa entitymanager persistence.xml


    【解决方案1】:

    您必须将persistence.xml 文件移动到适当的位置。

    更具体地说,将META-INF/persistence.xml 文件添加到源文件夹的根目录。

    在这种情况下,以下是合适的位置:src\main\java\META-INF\persistence.xml

    以下是详细信息: (取自 JPA 规范

    persistence.xml 文件定义了一个持久性单元。持久性.xml 文件位于根目录的 META-INF 目录中 持久性单元。

    持久化单元的根是这里的关键。

    如果您是非 Java EE 应用程序

    其 META-INF 目录包含的 jar 文件或目录 persistence.xml 文件被称为持久单元的根。

    如果您在 Java EE 应用程序中,则以下内容有效

    在 Java EE 环境中,持久性单元的根必须是以下之一 以下:

    • 一个 EJB-JAR 文件
    • WAR 文件的 WEB-INF/classes 目录[80]
    • WAR文件的WEB-INF/lib目录下的jar文件
    • EAR 库目录中的 jar 文件
    • 应用程序客户端 jar 文件

    【讨论】:

    • 你真的把我从长达一周的长篇大论中解救出来
    【解决方案2】:

    快速建议:

    • 检查 persistence.xml 是否在您的类路径中
    • 检查休眠提供程序是否在您的类路径中

    在独立应用程序(JavaEE 之外)中使用 JPA 时,需要在某处指定持久性提供程序。据我所知,这可以通过两种方式完成:

    在我的例子中,我发现由于 maven 配置错误,hibernate-entitymanager.jar 没有被包含为依赖项,即使它是其他模块的临时依赖项。

    也可以在这里查看答案:No Persistence provider for EntityManager named

    【讨论】:

    • hibernate-entitymanager.jar 对我来说也是正确的答案。
    【解决方案3】:

    所以就我而言,一切都在类路径中,但我必须添加

    类 c = Class.forName("org.eclipse.persistence.jpa.PersistenceProvider");

    我认为这导致 PersistenceProvider 向 javax 类注册自身。过去我也不得不为 JDBC 驱动程序做类似的事情。

    【讨论】:

      【解决方案4】:

      我最近将NB 8.1升级到8.2,突然遇到这个问题,花了2天的时间来解决这个问题。直到 8.1,删除处理器路径(上面提到的其他人)工作。在 8.2 中,问题仍然存在。

      最后,我发现EclipseLink(JPA 2.1)的默认库中缺少eclipselink.jar。我将文件添加到库的定义中,瞧——它开始工作了!

      【讨论】:

        【解决方案5】:

        如果您不想移动 META-INF 文件夹(可能是因为这是您的 IDE 创建它的位置并且您不想混淆它),并且如果您使用的是 Maven,您可以告诉 Maven 在哪里查看对于 META-INF,使用 &lt;resources&gt;tag。见:http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

        在你的情况下:

        <build>
          <resources>
            <resource>
              <directory>src</directory>
            </resource>
          </resources>
        </build>
        

        【讨论】:

          【解决方案6】:

          不要明确给出 JPA 依赖项

                  <dependency>
                              <groupId>javax.persistence</groupId>
                              <artifactId>persistence-api</artifactId>
                              <version>1.0.2</version>    
                </dependency>
          

          谢谢,
          拉胡尔

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-08
            • 2016-04-18
            • 1970-01-01
            • 2019-12-04
            • 2014-03-03
            • 2016-08-02
            相关资源
            最近更新 更多