15

我正在使用 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
       ...
    }
}

我的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>

我的项目结构:

这是我的项目的结构:

4

6 回答 6

18

您必须将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 文件
于 2013-10-11T21:10:25.350 回答
12

快速建议:

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

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

  • 或者将提供者元素添加到持久性单元中:(<provider>org.hibernate.ejb.HibernatePersistence</provider>如 Chris 在此处的正确答案中所述:https ://stackoverflow.com/a/1285436/784594 )
  • 或接口 javax.persistence.spi.PersistenceProvider 的提供者必须指定为服务,请参见此处:http ://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (这通常是当您将 hibernate 或其他 JPA 实现包含到您的类路径中时包含

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

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

于 2014-03-06T12:30:06.053 回答
1

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

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

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

于 2014-09-25T20:17:50.563 回答
1

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

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

于 2016-12-23T01:31:17.033 回答
0

如果您不想移动 META-INF 文件夹(可能是因为这是您的 IDE 创建它并且您不想混淆它),并且如果您使用的是 Maven,您可以告诉 Maven 在哪里寻找 META- INF 使用<resources>标签。请参阅:http ://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

在你的情况下:

<build>
  <resources>
    <resource>
      <directory>src</directory>
    </resource>
  </resources>
</build>
于 2016-12-15T08:24:31.987 回答
0

不要明确给出 JPA 依赖项

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

谢谢,
拉胡尔

于 2017-09-20T09:42:58.907 回答