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

Posted

技术标签:

【中文标题】没有名为 X 的 EntityManager 的持久性提供程序【英文标题】:No Persistence provider for EntityManager named X 【发布时间】: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>

我的项目结构:

【问题讨论】:

【参考方案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 时,需要在某处指定持久性提供程序。据我所知,这可以通过两种方式完成:

将提供者元素添加到持久性单元中:&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;(如 Chris 在此处的正确答案中所述:https://***.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 没有被包含为依赖项,即使它是其他模块的临时依赖项。

也可以在这里查看答案: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>

谢谢, 拉胡尔

【讨论】:

以上是关于没有名为 X 的 EntityManager 的持久性提供程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用休眠将mysql与Java连接?例外:没有名为 org.hibernate.tutorial_jpa 的 EntityManager 的持久性提供程序 [关闭]

有没有办法在游戏中使用 EntityManager!框架 1.2.x 404 页面?

JPA EntityManager 返回没有 entityManager.clear 的陈旧值

持久化对象时没有可用的事务性 EntityManager

创建没有 persistence.xml 配置文件的 JPA EntityManager

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