没有名为X的EntityManager的持久性提供程序

jos*_*737 13 java jpa entitymanager persistence.xml java-ee

我正在使用JPA开发JavaSE应用程序.不幸的是,我null打电话后: Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

您将在下面找到:

  • 我的代码片段,调用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
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

我的项目结构:

这是我项目的结构:

cmd*_*cmd 16

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

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

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

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

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

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

如果您是非Java EE应用程序

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

如果您使用的是Java EE应用程序,则以下内容均有效

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

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


Ond*_*Mih 11

快速建议:

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

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

在我的例子中,我发现由于maven配置错误,hibernate-entitymanager.jar不包含在依赖项中,即使它是其他模块的瞬态依赖项.

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

  • hibernate-entitymanager.jar也是我的正确答案. (2认同)