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

Rob*_*nru 143 java persistence jpa toplink

我在META-INF目录下使用toplink,使用相同名称的persistence.xml.然后我让我的代码调用它:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息

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

它应该在类路径中.然而,我得到了上述错误.

Ual*_*Jr. 86

把它放在"hibernate-entitymanager.jar"应用程序的类路径中.
对于较新的版本,您应该使用"hibernate-core.jar"而不是弃用hibernate-entitymanager

如果您正在运行某些IDE,例如Eclipse:Project Properties -> Java Build Path -> Libraries.

否则将其放入/lib您的应用程序中.

  • 对于我们这些使用Maven的人来说,那就是groupid`org.hibernate` artifactid`hibernate-entitymanager` (7认同)
  • 花了我几个小时才发现这是原因.对于搜索这个血腥jar的其他人,在Hibernate 4.1.3的情况下,它在hibernate-release-4.1.3.Final\lib\jpa\hibernate-entitymanager-4.1.3.Final.jar中 (3认同)
  • 刚花了几个小时确认persistence.xml是在类路径上,并比较了这个项目的每个方面,以及它不起作用的项目.非常误导性的错误消息,因为如果缺少persistence.xml,如果缺少具有该名称的PU,或者显然如果缺少hibernate jar,则会发生这种错误消息! (3认同)
  • 这对我来说是eclipselink.jar,在路径中缺失了.路径中根本没有hibernate*something.jar. (2认同)

小智 84

之后<persistence-unit name="agisdb">,定义持久性提供程序名称:

<provider>org.hibernate.ejb.HibernatePersistence</provider>
Run Code Online (Sandbox Code Playgroud)

  • **在我的情况下这不是必需的,但*classpathing*hibernate-entitymanager*.jar**如*Ualter Jr*s回答中所述.我正在使用带有*hibernate-core-4.3.7.jar*,*hibernate-entitymanager-4.3.7.Final.jar*和*hibernate-jpa-2.1-api-1.0.0.jar*的独立GWT应用程序. (6认同)
  • 我正在使用Derby并没有必要指定它(我做了,但是一旦我解决了问题就把它删除了,只是为了确保).我最终得到了错误,因为persistence.xml不在src/META-INF文件夹中,即使它已经存在于项目的Eclipse源路径中的文件夹中.我在想某个地方很难接受src/* (5认同)
  • 我有点惊讶你没有遇到`<provider />`的问题,而使用hibernate-4时你应该将你的提供者更改为`<provider> org.hibernate.jpa.HibernatePersistenceProvider </ provider>` ,请参阅http://stackoverflow.com/questions/23041964/jpa-2-1-hibernate-4-3-deprecation-warning. (4认同)
  • 与@AndreasDietrich相同,在pom.xml中将“ hibernate-core-4.3.10”工件替换为“ hibernate-entitymanager-4.3.10”(我使用maven)后,此错误消失了。实际上,http://hibernate.org/orm/downloads/表示您应该为JPA使用“ hibernate-entitymanager-4.3.10”。 (2认同)

小智 66

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

  • 这对我没用,带来了Persistence单元未找到:'null'错误.将其移回/src/main/resources/META-INF/persistence.xml (8认同)
  • 谢谢,对我来说,路径是目标/类/ META-INF (2认同)

tec*_*rat 17

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

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Sne*_*neg 15

面对同样的问题,很长一段时间都找不到解决方案.在我的情况下,它有助于替换

<provider>org.hibernate.ejb.HibernatePersistence</provider>
Run Code Online (Sandbox Code Playgroud)

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Run Code Online (Sandbox Code Playgroud)

这里解决问题

  • 从Hibernate 4.3.5升级到5.2.12并且此提供程序名称更改为我解决了问题.该设置似乎允许JPA使用核心.jar文件而不是在Maven中央存储库上显示为已弃用的实体管理器.jar.非常感谢分享. (2认同)

Gil*_*rto 9

也许你定义了一个提供者,<provider>org.hibernate.ejb.HibernatePersistence</provider>但在jar中引用另一个提供者.这发生在我身上:我的persistence.xml提供程序是openjpa,但我在我的类路径中使用了eclipselink.希望这有帮助!


col*_*nic 9

还有一点:如果您在Eclipse RCP环境中遇到此问题,则可能必须将Factory生成更改Persistence.createEntityManagerFactorynew PersistenceProvider().createEntityManagerFactory

请参阅ECF对此进行详细讨论.


Ond*_*Mih 7

快速建议:

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

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

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


wyp*_*prz 5

如果您使用的是Eclipse,请确保排除模式不会persistence.xml从构建路径中删除源文件夹.

  1. 转到属性 - > Java构建路径 - >源选项卡
  2. 检查位于
    MyProject/src/main/java -> Excluded: <your_pattern>
    树节点的排除模式
  3. (可选)Excluded: (None)通过选择节点并单击左侧的编辑...按钮将其设置为.


小智 5

我在这里参加聚会晚了几年,但在尝试让 Hibernate 3.5.1 与 HSQLDB 和桌面 JavaFX 程序一起工作时遇到了同样的异常。我在这个线程的帮助下和大量的试验和错误中得到了它。您似乎因各种问题而收到此错误:

No Persistence provider for EntityManager named mick
Run Code Online (Sandbox Code Playgroud)

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

有点令人困惑的是,这些(下面)是我在 build.gradle 文件中唯一需要的两个文件。Hibernate 文档并不清楚您需要包含哪些 Jars。Entity-manager 引起了混乱,在最新的 Hibernate 版本中不再需要,javax.persistence-api 也不再需要。请注意,我在这里使用的是 Java 10,因此我必须包含 jaxb-api,以解决一些 xml-bind 错误,并在我的 module-info.java 文件中为 java 持久性模块添加一个条目。

构建.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'
Run Code Online (Sandbox Code Playgroud)

模块信息.java

// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;
Run Code Online (Sandbox Code Playgroud)

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

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Run Code Online (Sandbox Code Playgroud)

persistence.xml 文件应位于正确的目录中,以便:

src/main/resources/META-INF/persistence.xml
Run Code Online (Sandbox Code Playgroud)

单步调试 Intellij 调试器中的 hibernate 源代码,在那里检查方言,也会抛出完全相同的异常,因为persistence.xml 文件中缺少方言属性。我添加了这个(为您的数据库类型添加正确的一个):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
Run Code Online (Sandbox Code Playgroud)

在此之后,我仍然遇到相同的异常,因此在 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>
Run Code Online (Sandbox Code Playgroud)

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