没有名为 X 的实体管理器的持久性提供程序

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

您将在下面找到:

  • 我的代码片段调用并意外返回EntityManagerFactorynull
  • 我的文件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
       ...
    }
}

我的坚持.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>

我的项目结构:

This is the structure of my project:


答案 1

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

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

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

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

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

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

如果您是非 Java EE 应用程序

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

如果您使用的是 Java EE 应用程序,则以下各项有效

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

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

答案 2

快速建议:

  • 检查持久性.xml是否在类路径中
  • 检查休眠提供程序是否在类路径中

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

在我的情况下,我发现由于 maven 配置错误,休眠实体管理器.jar未作为依赖项包含在内,即使它是其他模块的暂时依赖项。

另请参阅此处的答案:没有名为 EntityManager 的持久性提供程序


推荐