没有名为 EntityManager 的持久化提供者。

171

我有一个名为 persistence.xml 的文件,在 META-INF 目录下使用 TopLink。然后,我用以下代码调用它:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

然而,我收到了以下错误消息:

2009-07-21 09:22:41,018 [main] ERROR - No Persistence provider for EntityManager named agisdb
javax.persistence.PersistenceException: No Persistence provider for EntityManager named agisdb
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)

这是persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="agisdb">
        <class>com.agis.livedb.domain.AddressEntity</class>
        <class>com.agis.livedb.domain.TrafficCameraEntity</class>
        <class>com.agis.livedb.domain.TrafficPhotoEntity</class>
        <class>com.agis.livedb.domain.TrafficReportEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

它应该已经在类路径中了,但是我还是遇到了上述错误。

33个回答

91
"hibernate-entitymanager.jar" 放在应用程序的类路径中。
对于更新的版本,您应该使用 "hibernate-core.jar" 代替已弃用的 hibernate-entitymanager
如果您是通过一些集成开发环境(如 Eclipse)运行的:项目属性 -> Java Build Path -> 库。 否则,请将其放在应用程序的 /lib 目录下。

3
我需要几个小时才能弄清楚这是原因。对于其他寻找该可恶的 jar 文件的人,针对 Hibernate 4.1.3 版本,它在 hibernate-release-4.1.3.Final\lib\jpa\hibernate-entitymanager-4.1.3.Final.jar 中。 - Vedran
9
对于那些正在使用Maven的人,所需的groupid是 org.hibernate ,artifactid是 hibernate-entitymanager - Simon Forsberg
2
对我来说,问题出在缺少路径中的eclipselink.jar文件。路径中根本没有hibernate*something.jar文件。 - user unknown
4
刚刚花了几个小时确认 persistence.xml 是否在类路径上,并比较了一个能够工作的项目和一个不能工作的项目的各个方面。由于可能发生的情况包括缺少 persistence.xml,缺少该名称的 PU,或者显然缺少 hibernate jar,因此错误信息非常具有误导性! - David Mann
对我而言,它是带有“test”范围的“org.eclipse.persistence.jpa”。 - Marek
显示剩余2条评论

89
<persistence-unit name="agisdb">之后,定义持久性提供程序名称:
<provider>org.hibernate.ejb.HibernatePersistence</provider>

6
我正在使用Derby,但实际上并不需要特别指定它(我当初这么做了,但解决问题后又删掉了,只是为了确认一下)。最终出现错误是因为 persistence.xml 文件不在 src/META-INF 文件夹中,尽管它一直在 Eclipse 项目的源路径中的一个文件夹中。我认为某处硬编码了它必须在 src/* 中。 - Fuhrmanator
6
在我的情况下这并不是必要的,但是根据下面Ualter Jr的回答,需要将hibernate-entitymanager.jar加入classpath。我正在使用一个独立的GWT应用程序,其中包括hibernate-core-4.3.7.jarhibernate-entitymanager-4.3.7.Final.jarhibernate-jpa-2.1-api-1.0.0.jar - Andreas Covidiot
4
在pom.xml文件中用"hibernate-entitymanager-4.3.10"代替"hibernate-core-4.3.10"(我使用的是maven),和@AndreasDietrich一样,这个错误就没有了。实际上,http://hibernate.org/orm/downloads/建议在JPA中使用"hibernate-entitymanager-4.3.10"。请注意不要改变原意,使内容通俗易懂。 - Hong
1
除此之外,我还不得不从 hibernate-entitymanager-3.4.0.GA 升级到 3.6.10.Final。以防你仍在使用 Hibernate 3 的遗留代码库。 - Javi Vazquez
6
我有点惊讶你在使用hibernate-4时没有遇到<provider/>的问题,你需要将提供程序更改为 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>,参见https://dev59.com/0H7aa4cB1Zd3GeqPtKuX。 - Robert Heine
你的Maven项目也有可能没有在Manifest.mf中生成类路径。请检查你生成的war文件中这个文件的内容。 - Sridhar Sarnobat

69

请确保 persistence.xml 文件位于以下目录:<webroot>/WEB-INF/classes/META-INF


10
这对我没有用,出现了“持久化单元未找到:'null'”的错误。将其移回 /src/main/resources/META-INF/persistence.xml。 - tomasb
1
我猜这适用于那些使用toplink(或其他与Web相关的东西)的人,对于其他人来说,这里的其他答案可能更合适。 - Simon Forsberg
2
谢谢,对我来说路径是target/classes/META-INF。 - Frizz1977
由于某种奇怪的原因,它需要在META-INF目录中,否则无法工作... - Thomas

21
面对同样的问题,很长一段时间都找不到解决方案。在我的情况下,将其替换为有所帮助。
<provider>org.hibernate.ejb.HibernatePersistence</provider>

随着

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

参考这里的解决方案。


3
升级Hibernate 4.3.5到5.2.12时,通过更改提供者名称,我的问题得到解决。该设置似乎允许JPA使用核心.jar文件,而不是在Maven中央存储库上显示为已弃用的实体管理器.jar文件。非常感谢分享。 - joshpt

19

我需要在我的pom.xml文件中加入这个:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>

适用于版本4.3.11。 - petertc
已经过时,请参见上文。请改用 hibernate-core。 - foo

10

还有一点需要注意:如果你在Eclipse RCP环境中遇到这个问题,你可能需要将工厂生成方式从Persistence.createEntityManagerFactory更改为new PersistenceProvider().createEntityManagerFactory

详细讨论请参见ECF


这正是我在使用org.eclipse.persistence.jpa 2.4.0时遇到的确切问题。我花了整整两个小时,纠结于为什么它找不到我的persisence.xml文件,简直让我抓狂。所有的例子似乎都没有涉及到这一点。哦,好吧...非常感谢! - Mark Miller
'PersistenceProvider'是抽象的,无法被实例化。 - Zon

9
也许你定义了一个提供者,例如<provider>org.hibernate.ejb.HibernatePersistence</provider>,但是引用了jar中的另一个提供者。我遇到过这种情况:我的persistence.xml提供者是openjpa,但我在类路径中使用的是eclipselink。 希望这可以帮助你!

6

快速建议:

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

在独立应用程序(JavaEE 之外)中使用 JPA 时,需要在某个地方指定持久性提供程序。我知道有两种方法可以实现:

在我的情况下,我发现由于 Maven 配置错误,即使它是其他模块的瞬态依赖项,也未将 hibernate-entitymanager jar 包含为依赖项。


/facepalm - 我忘记为Hibernate提供程序添加Maven依赖项了。谢谢! - jgitter

5

虽然我有些晚了,但我也遇到了同样的问题。在尝试将Hibernate 3.5.1与HSQLDB和桌面JavaFX程序一起使用时,我遇到了这个异常。通过参考这个线程和大量的试错,我最终解决了这个问题。看起来这个错误可能由各种问题引起:

No Persistence provider for EntityManager named mick

我尝试构建Hibernate教程示例,但由于我使用的是Java 10,所以无法轻松地构建和运行它们。我放弃了这个想法,不想浪费时间去解决它的问题。设置module-info.java文件(Jigsaw)是另一个许多人尚未发现的复杂问题。

有些令人困惑的是,下面这两个文件是我在build.gradle文件中所需的唯一文件。Hibernate文档没有明确说明需要包括哪些Jar文件。Entity-manager会导致混乱,并且在最新的Hibernate版本中不再需要javax.persistence-api。请注意,我在这里使用的是Java 10,因此我必须包含jaxb-api,以解决一些xml-bind错误,并在我的module-info.java文件中添加Java Persistence模块的条目。

Build.gradle

// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')

// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'

Module-info.java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;

在hibernate 5.3.1版本中,您无需在persistence.xml文件中指定提供程序。如果未提供,则默认选择Hibernate提供程序。

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

持久化配置文件 persistence.xml 应该放置在正确的目录中,因此:

src/main/resources/META-INF/persistence.xml

在Intellij调试器中逐步查看Hibernate源代码时,它检查方言时也出现了同样的异常,因为persistence.xml文件中缺少方言属性。我添加了这个(根据你的DB类型添加正确的方言):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

在这之后我仍然得到了相同的异常,因此我在Intellij中再次通过调试器进行步进操作,发现我正在尝试持久化的测试实体(简单的父子例子)缺少OneToMany、ManyToOne关系的注释。我修复了这个问题,异常消失了,我的实体也被成功地持久化了。
以下是我的完整的最终persistence.xml配置:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
            http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
    <description>
        Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
    </description>

    <!-- Provided in latest release of hibernate
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    -->

    <class>com.micks.scenebuilderdemo.database.Parent</class>
    <class>com.micks.scenebuilderdemo.database.Child</class>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>

        <property name="javax.persistence.jdbc.url"
                  value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>

        <property name="javax.persistence.jdbc.user" value="sa"/>
        <property name="javax.persistence.jdbc.password" value=""/>

        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    </properties>

</persistence-unit>

</persistence>

我可能浪费了大约半天的时间在这个宝石上。我的建议是从非常简单的开始——一个拥有一两个字段的单个测试实体,因为这个异常似乎有很多可能的原因。

非常感谢您提供的配置细节,真的帮助解决了问题。 - Doogle

5
如果您正在使用Eclipse,请确保排除模式不会从构建路径上的源文件夹中删除您的。请按以下步骤操作:
1. 转到属性 -> Java构建路径 -> 源选项卡 2. 检查位于
MyProject/src/main/java -> Excluded: <your_pattern>
树节点处的排除模式。 3. 可选地,通过选择节点并单击左侧的编辑...按钮将其设置为Excluded: (None)

解决了我的问题。在fetch/pull之后,排除模式被设置为“**”。我不知道为什么... - Jocelyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接