ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


D
Dave Jarvis

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

<provider>org.hibernate.ejb.HibernatePersistence</provider>

我正在使用 Derby,没有必要指定这一点(我做了,但在解决问题后将其删除,只是为了确保)。我终于得到了错误,因为 persistence.xml 不在 src/META-INF 文件夹中,即使它位于项目的 Eclipse 源路径中的文件夹中。我在想某个地方很难连接到 src/*
在我的情况下,这不是必需的,但是如 Ualter Jrs 下面的回答中所述,类路径 hibernate-entitymanager*.jar 。我正在使用带有 hibernate-core-4.3.7.jar、hibernate-entitymanager-4.3.7.Final.jar 和 hibernate-jpa-2.1-api-1.0.0.jar 的独立 GWT 应用程序。
与@AndreasDietrich 相同,在 pom.xml 中将“hibernate-core-4.3.10”工件替换为“hibernate-entitymanager-4.3.10”(我使用 maven)后,此错误消失了。实际上,hibernate.org/orm/downloads 表示您应该为 JPA 使用“hibernate-entitymanager-4.3.10”。
除此之外,我还必须从 hibernate-entitymanager-3.4.0.GA 升级到 3.6.10.Final。以防万一您仍然有使用 Hibernate 3 的遗留代码库。
我有点惊讶您的 <provider/> 没有遇到问题,在使用 hibernate-4 时,您应该将您的提供程序更改为 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>,请参阅 stackoverflow.com/questions/23041964/…
V
Vogel612

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

如果您通过某些 IDE(例如 Eclipse)运行:Project Properties -> Java Build Path -> Libraries.

否则将其放在您的应用程序的 /lib 中。


我花了几个小时才弄清楚这是原因。对于寻找这个血腥罐子的其他人,如果是 Hibernate 4.1.3,它在 hibernate-release-4.1.3.Final\lib\jpa\hibernate-entitymanager-4.1.3.Final.jar
对于我们这些使用 Maven 的人来说,这将是 groupid org.hibernate artifactid hibernate-entitymanager
对我来说,它是 eclipselink.jar,路径中缺少它。路径中根本没有 hibernate*something.jar。
只花了几个小时确认persistence.xml 在类路径上,并比较了一个适用的项目和一个不适用的项目的各个方面。非常误导性的错误消息,因为如果缺少persistence.xml,如果缺少具有该名称的PU,或者显然如果缺少休眠jar,就会发生这种错误消息!
对我来说,范围测试是 org.eclipse.persistence.jpa
S
SkyWalker

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


这对我不起作用,带来了 Persistence unit not found: 'null' 错误。将其移回 /src/main/resources/META-INF/persistence.xml
我想这适用于那些使用 toplink (或其他与网络相关的东西)的人,对于其他所有人来说,这里的其他答案可能更合适。
谢谢,对我来说路径是 target/classes/META-INF
同样,由于某些奇怪的原因,它需要位于 META-INF 目录中,否则将无法正常工作...
C
Community

遇到同样的问题,很长一段时间都找不到解决方案。就我而言,它有助于更换

<provider>org.hibernate.ejb.HibernatePersistence</provider>

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

here 得到解决方案


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

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

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

适用于版本 4.3.11。
已弃用,见上文。请改用休眠核心。
J
Jin Kwon

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

有关这方面的详细讨论,请参见 ECF


这正是我在使用 org.eclipse.persistence.jpa 2.4.0 时遇到的问题。我真的花了 2 个小时把头发拉出来,想知道为什么它找不到我的 persisence.xml。所有的例子似乎都没有包含这一点。哦,好吧......非常感谢!
G
Gilberto

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


C
Community

快速建议:

检查 persistence.xml 是否在您的类路径中

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

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

将提供者元素添加到持久性单元中:org.hibernate.ejb.HibernatePersistence(如 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 没有被包含为依赖项,即使它是其他模块的临时依赖项。


/facepalm - 我忘记为休眠提供程序添加 maven 依赖项。谢谢!
w
wypieprz

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

转到 Properties -> Java Build Path -> Source 选项卡检查位于 MyProject/src/main/java -> Excluded: 树节点的排除模式 或者,通过选择节点将其设置为 Excluded: (None)并单击左侧的编辑...按钮。


解决了我的问题。提取/拉取后,排除模式设置为“**”。我不知道为什么...
M
MickG

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

No Persistence provider for EntityManager named mick

我尝试构建 hibernate 教程示例,但因为我使用的是 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'

模块信息.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 文件中缺少方言属性。我添加了这个(为您的数据库类型添加正确的一个):

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

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


非常感谢您提供的配置细节确实有助于解决它。
R
Rob

极端情况:如果您使用 m2Eclipse,它会自动将排除项放在您的资源文件夹中。那么当你尝试在eclipse里面运行测试的时候,后续没有persistence.xml就会产生这个错误。


h
harcharan

确保您已在“src”文件夹下创建了 persistence.xml 文件。我在项目文件夹下创建,这是我的问题。


Eclipse 4.4.0 不想嵌套 SRC 文件夹,所以我将 META-INF 放在顶层,认为persistence.xml 在类路径上就足够了。不是!我必须手动创建一个 src/META-INF(在操作系统中)并手动移动 persistence.xml 文件。也许在 Eclipse 中可以做到这一点,但我想不通。
e
esfandia

如果您使用的是 Maven,则可能是它没有为 META-INF 文件夹寻找正确的位置。其他人提到了复制该文件夹,但另一种对我有用的方法是告诉 Maven 在哪里寻找它,使用 <resources> 标记。请参阅:http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html


u
user unknown

当实体管理器试图指向许多持久性单元时会发生这种情况。执行以下步骤:

在编辑器中打开相关文件(前提是您的项目已在 IDE 中关闭)删除所有持久性和实体管理器相关代码保存文件在 IDE 中打开项目现在绑定您选择的数据库或表


E
E_X

我遇到了同样的问题,但在 EclipseLink version 2.5.0 上。

我通过添加另一个必要的 jar 文件解决了我的问题(javax.persistence_2.1.0.v201304241213.jar.jar);

需要的罐子: - javax.persistence_2.1.0.v201304241213.jar - eclipselink.jar - jdbc.jar(取决于使用的数据库)。

我希望这有帮助。


L
Ludovic Guillaume

我也遇到了这个错误,但问题是 persistence.xml 中的命名空间 uri。

我将 http://xmlns.jcp.org/xml/ns/persistence 替换为 http://java.sun.com/xml/ns/persistence 并将版本 2.1 替换为 2.0。

它现在正在工作。


这正是我使用 Tomcat 所发生的事情。我只是添加了一个完整的标题来为新用户澄清
v
vijayinani

您需要在类路径中添加 hibernate-entitymanager-x.jar。

在 Hibernate 4.x 中,如果 jar 存在,则无需在 persistence.xml 文件中添加 org.hibernate.ejb.HibernatePersistence。


s
sch001

就我而言,之前我使用idea通过数据库模式生成实体,并且persistence.xmlsrc/main/java/META-INF中自动生成,并根据https://stackoverflow.com/a/23890419/10701129将其移至src/main/resources/META-INF,也将META-INF标记为源根。这个对我有用。

但只是简单地将原始 META-INF(即 src/main/java/META-INF)标记为源根目录是行不通的,这让我感到困惑。

https://i.stack.imgur.com/UQN5x.png


这也是我的解决方案。我有一个 Maven 项目,我在资源下手动创建了这个文件夹(META-INF)。然后我确保在战争文件 META-INF 文件夹中放置在:\WEB-INF\classes\META-INF
R
Rónán Ó Braonáin

这个问题已经回答了,但只是想发布一个让我感到困惑的提示。此异常是在先前的错误之后引发的。我得到了这个:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

即使我更改了 persistence.xml 以包含新的属性名称:

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

在有关已弃用的属性名称的消息之后,我得到了与上面相同的 PersistenceException 以及其他一系列异常。我的提示:确保检查异常香肠的开头。

Glassfish v2.1.1 中似乎存在一个错误,在该错误中重新部署或取消部署和部署不会更新缓存在某处的 persistence.xml。我不得不重新启动服务器,然后它才能工作。


s
schieferstapel

在 OSGi 上下文中,有必要在包的 MANIFEST.MF 中列出您的持久性单元,例如

JPA-PersistenceUnits: my-persistence-unit

否则,JPA 捆绑包不会知道您的捆绑包包含持久性单元。

请参阅http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE


y
yeafee

您需要在类路径中包含以下 jar 文件:

antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.0.1.Final.jar hibernate-entitymanager.jar hibernate-jpa-2.0-api-1.0.0.Final.jar javassist-3.9.0.jar jboss-logging-3.1.1.GA.jar jta-1.1.jar slf4j-api-1.5.8.jar xxx-jdbc -driver.jar


Z
Zakaria Bouazza

我刚刚将 META-INF 复制到 src 并工作了!


P
Pramod Kumar Sharma

Hibernate 5.2.5
类路径中需要的 Jar 文件。它位于 Hibernate 5.2.5 最终版本的必需文件夹中。它可以从 http://hibernate.org/orm/downloads/ 下载

antlr-2.7.7 cdi-api-1.1 classmate-1.3.0 dom4j-1.6.1 el-api-2.2 geronimo-jta_1.1_spec-1.1.1 hibernate-commons-annotation-5.0.1.Final hibernate-core-5.2 .5.Final hibernate-jpa-2.1-api-1.0.0.Final jandex-2.0.3.Final javassist-3.20.0-GA javax.inject-1 jboss-interceptor-api_1.1_spec-1.0.0.Beta1 jboss -logging-3.3.0.Final jsr250-api-1.0

在中创建一个 xml 文件“persistence.xml”

YourProject/src/META-INF/persistence.xml

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>

<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="sample">

    <class>org.pramod.data.object.UserDetail</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
        <property name="hibernate.connection.username" value="root"/>
        <property name="hibernate.connection.password" value="root"/>
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="false"/>

        <property name="hibernate.cache.use_second_level_cache" value="false"/>

        <property name="hibernate.archive.autodetection" value="true"/>
    </properties>
</persistence-unit>

请记下标签中提到的信息,版本应该是2.1。请注意名称 标签,名称被提及为“样本”。在加载您的文件时,此名称需要使用完全相同

EntityManagerFactor = Persistance.createEntityManagerFactory("sample");. “样本”可以根据您的命名约定进行更改。

现在创建一个实体类。根据我的示例 UserDetail 的名称,在包 org.pramod.data.object 中

用户详细信息.java

package org.pramod.data.object;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "user_detail")
public class UserDetail {
    @Id
    @Column(name="user_id")
    private int id;
    @Column(name="user_name")
    private String userName;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }   
    @Override
    public String toString() {
       return "UserDetail [id=" + id + ", userName=" + userName + "]";
    }
}

现在用 main 方法创建一个类。

HibernateTest.java

package org.pramod.hibernate;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;

public class HibernateTest {
    private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args)  {
        UserDetail user = new UserDetail();
        user.setId(1);
        user.setUserName("Pramod Sharma");

        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("sample");
            EntityManager entityManager = entityManagerFactory.createEntityManager();
            entityManager.getTransaction().begin();
            entityManager.persist( user );
            entityManager.getTransaction().commit();
            System.out.println("successfull");
            entityManager.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

输出将是

UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull

b
burseaner

如果 Persistence.createEntityManagerFactory("JPAService") 在不同的类中有不同的名称,则会收到错误消息。 通过重构可以获得不同的名称,这就是我的情况。在 private void initComponents() 中自动生成的 Persistence.createEntityManagerFactory("JPAService") 类中,ContactsTable 类与 DBManager 类中的 Persistence.createEntityManagerFactory("JPAServiceExtended") 不同。


D
Dhwaneel

我通过在 persistence.xml 例如 <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 中添加信息得到解决,然后确保您在类路径中有库,例如在 Maven 添加依赖项

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>

A
Atul Jain

验证永久单元名称

<persistence-unit name="com.myapp.model.jpa"
    transaction-type="RESOURCE_LOCAL">    
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);

W
Wojtek Piróg

就我而言,这是关于以下两个属性的错误。当我更改它们时,“没有名为 EntityManager 的持久性提供程序”消失了。

因此,您可以尝试测试与您的属性的连接以检查一切是否正确。

<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>

奇怪的错误,我完全被它弄糊涂了。


m
m02ph3u5

也尝试将 persistence.xml 手动复制到文件夹 <project root>\bin\META-INF。这使用一个简单的插件项目解决了 Eclipse Neon 中的 EclipseLink 2.5.2 问题。


k
keemsisi

有同样的问题,但这实际上对我有用:

mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.

注意:上面的 maven 命令将从头开始重新安装所有项目依赖项。由于 Maven 正在发出网络请求,您的控制台将加载详细日志。


B
Braian Coronel

您必须使用文件的绝对路径,否则这将不起作用。然后使用该路径构建文件并将其传递给配置。

@Throws(HibernateException::class)
fun getSessionFactory() : SessionFactory {
    return Configuration()
                .configure(getFile())
                .buildSessionFactory()
    }


private fun getFile(canonicalName: String): File {
    val absolutePathCurrentModule = System.getProperty("user.dir")
    val pathFromProjectRoot = absolutePathCurrentModule.dropLastWhile { it != '/' }
    val absolutePathFromProjectRoot = "${pathFromProjectRoot}module-name/src/main/resources/$canonicalName"
    println("Absolute Path of secret-hibernate.cfg.xml: $absolutePathFromProjectRoot")
    return File(absolutePathFromProjectRoot)
}

总帐

Source


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅