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


148

我在目录下persistence.xml使用相同的名字。然后,我用以下代码调用它:TopLinkMETA-INF

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

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

2009-07-21 09:22:41,018 [main]错误-名为agisdb的EntityManager没有持久性提供程序
javax.persistence.PersistenceException:名为ag​​isdb的EntityManager的持久性提供程序
    在javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
    在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>

它应该在类路径中。但是,我得到了上面的错误。

Answers:


85

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

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

5
我使用的是Derby,没有必要指定它(我是这样做的,但是,一旦确定问题,便确定要删除它)。最终我得到了错误,因为persistence.xml不在src / META-INF文件夹中,即使它已经在项目的Eclipse源路径中的文件夹中也是如此。我在想某处很难在src / *上布线
Fuhrmanator 2014年

6
在我的情况下,这不是必需的,但是如下面的Ualter Jr的回答所述,对classpathing hibernate-entitymanager * .jar进行了说明。我正在使用带有hibernate-core-4.3.7.jarhibernate-entitymanager-4.3.7.Final.jarhibernate-jpa-2.1-api-1.0.0.jar的独立GWT应用程序。
Andreas Dietrich 2014年

3
与@AndreasDietrich相同,在pom.xml中将“ hibernate-core-4.3.10”工件替换为“ hibernate-entitymanager-4.3.10”(我使用maven)后,此错误消失了。实际上,hibernate.org / orm / downloads表示您应该为JPA使用“ hibernate-entitymanager-4.3.10”。

1
除此之外,我还必须从hibernate-entitymanager-3.4.0.GA升级到3.6.10.Final。万一你仍然有使用Hibernate 3遗留代码库
哈维·巴斯克斯

5
我有点惊讶您没有遇到问题<provider/>,在使用hibernate-4时,您应该将提供程序更改为<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>,请参见stackoverflow.com/questions/23041964/…
罗布

86

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

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

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


3
花了我几个小时才找出原因。对于其他正在搜索此血腥jar的人,在Hibernate 4.1.3的情况下,它位于hibernate-release-4.1.3.Final \ lib \ jpa \ hibernate-entitymanager-4.1.3.Final.jar
Vedran

7
对于使用Maven的我们来说,这将是groupid的org.hibernate人工产物hibernate-entitymanager
Simon Forsberg,2013年

2
对我来说这是eclipselink.jar,它在路径中丢失了。路径中根本没有hibernate * something.jar。
用户未知

3
仅仅花了几个小时来确认persistence.xml在类路径上,然后比较了该项目适用于的项目和不适用的项目的各个方面。错误消息非常容易引起误解,因为如果缺少persistence.xml,缺少具有该名称的PU或显然缺少了一个休眠jar就会发生!
大卫·曼

对我来说,这是org.eclipse.persistence.jpa范围测试。
Marek

67

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


8
这对我不起作用,导致找不到持久性单元:“ null”错误。将其移回/src/main/resources/META-INF/persistence.xml
tomasb 2012年

1
我想这适用于那些使用toplink(或其他与Web相关的东西)的人,对于其他所有人,这里的其他答案可能更合适。
西蒙·佛斯伯格

2
谢谢,对我来说,路径是target / classes / META-INF
Frizz1977 '16

同样,出于某些奇怪的原因,它必须位于META-INF目录中,否则将无法使用...
Thomas

17

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

16

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

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

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

这里接受解决方案


2
从Hibernate 4.3.5升级到5.2.12,此提供程序名称更改为我解决了此问题。该设置似乎允许JPA使用核心.jar文件,而不是在Maven中央存储库上显示为不推荐使用的entity-manger .jar。非常感谢分享。
joshpt

10

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

有关此问题的详细讨论,请参见ECF


这是我在org.eclipse.persistence.jpa 2.4.0中遇到的确切问题。我实际上花了2个小时拉着头发,想知道为什么找不到我的persisence.xml。所有示例似乎都没有包含这一点。哦...非常感谢!
Mark Miller

9

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


7

快速建议:

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

在独立应用程序(JavaEE外部)中使用JPA时,需要在某处指定持久性提供程序。我可以通过两种方式来做到这一点:

在我的案例中,我发现由于行家配置错误,hibernate-entitymanager jar不作为依赖项包括在内,即使它是其他模块的临时依赖项也是如此。


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

5

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

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

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

5

我在这里参加聚会已经晚了几年,但是在尝试使Hibernate 3.5.1与HSQLDB和桌面JavaFX程序一起使用时遇到了同样的异常。我在该线程的帮助下进行了大量的反复试验,使其能够正常工作。看来您会因为各种问题而收到此错误:

No Persistence provider for EntityManager named mick

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

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

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

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

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

4

特例:如果使用的是m2Eclipse,它将自动在资源文件夹中放入排除项。然后,当您尝试在eclipse中运行测试时,随后缺少persistence.xml将会产生此错误。


3

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


Eclipse 4.4.0不想嵌套SRC文件夹,因此我将META-INF放在顶层,认为persistence.xml在类路径中就足够了。不!我必须手动创建src / META-INF(在操作系统中)并手动移动persistence.xml文件。也许可以在Eclipse中执行此操作,但是我无法弄清楚。
Fuhrmanator 2014年


2

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

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

2

我遇到了同样的问题,但是在EclipseLink 2.5.0版上

我通过添加另一个必须的jar文件(javax.persistence_2.1.0.v201304241213.jar.jar)。

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

我希望这有帮助。


2

我也遇到了此错误,但问题是 persistence.xml

我更换http://xmlns.jcp.org/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence 2.1至2.0版本。

现在正在工作。


这正是发生在我使用的是Tomcat ..我只是增加了一个完全首澄清新用户
childno͡.de

2

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

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


1

该问题已得到解答,但只是想发布一个提示,阻止了我。此异常是在先前的错误之后引发的。我得到这个:

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,该文件已缓存在某处。我必须重新启动服务器,然后它才能工作。



1

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

  1. antlr-2.7.6.jar
  2. commons-collections-3.1.jar
  3. dom4j-1.6.1.jar
  4. hibernate-commons-annotations-4.0.1.Final.jar
  5. hibernate-core-4.0.1.Final.jar
  6. hibernate-entitymanager.jar
  7. hibernate-jpa-2.0-api-1.0.0.Final.jar
  8. javassist-3.9.0.jar
  9. jboss-logging-3.1.1.GA.jar
  10. jta-1.1.jar
  11. slf4j-api-1.5.8.jar
  12. xxx-jdbc-driver.jar


1

Hibernate 5.2.5
Jar文件在类路径中是必需的。该文件位于Hibernate 5.2.5 Final版本的必需文件夹中。可以从http://hibernate.org/orm/downloads/下载

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. 同学1.3.0
  4. dom4j-1.6.1
  5. el-api-2.2
  6. geronimo-jta_1.1_spec-1.1.1
  7. hibernate-commons-annotation-5.0.1.Final
  8. 休眠核心5.2.5。最终版本
  9. hibernate-jpa-2.1-api-1.0.0。最终
  10. jandex-2.0.3。最终版
  11. javassist-3.20.0-GA
  12. javax.inject-1
  13. jboss-interceptor-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. jsr250-api-1.0

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

YourProject / src / META-INF / persistence.xml

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

  1. 请记下<persistance>标记中提到的信息,版本应为2.1。
  2. 请注意名称<persistance-unit>标记,名称被称为“样本”。载入您的名称时,必须使用完全相同的名称

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

现在创建一个Entity类。在我的示例org.pramod.data.object中具有名称(根据我的示例UserDetail)

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

1

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

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

这是结构: 在此处输入图片说明


0

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


0

我的解决方案是通过在persistence.xml中添加信息来解决的,例如<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>,确保您在classpath上具有库,例如在Maven中添加依赖项,例如

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

0

验证永久单位名称

<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**);

0

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

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

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

奇怪的错误,因此我完全感到困惑。


0

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


0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.