没有名为 X 的 EntityManager 的持久性提供程序
Posted
技术标签:
【中文标题】没有名为 X 的 EntityManager 的持久性提供程序【英文标题】:No Persistence provider for EntityManager named X 【发布时间】:2013-10-19 19:27:06 【问题描述】:我正在使用 JPA 开发 JavaSE 应用程序。不幸的是,我在致电后得到null
:
Persistence.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 时,需要在某处指定持久性提供程序。据我所知,这可以通过两种方式完成:
将提供者元素添加到持久性单元中:<provider>org.hibernate.ejb.HibernatePersistence</provider>
(如 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,使用 <resources>
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 的陈旧值