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

时间:2009-07-21 09:29:10

标签: java jpa persistence toplink

我在META-INF目录下使用toplink创建了具有相同名称的persistence.xml。 然后我用我的代码调用它:

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>

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

32 个答案:

答案 0 :(得分:86)

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

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

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

答案 1 :(得分:84)

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

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

答案 2 :(得分:66)

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

答案 3 :(得分:17)

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

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

答案 4 :(得分:15)

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

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

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

here

取得解决方案

答案 5 :(得分:9)

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

答案 6 :(得分:9)

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

请参阅ECF以获取详细讨论。

答案 7 :(得分:7)

快速建议:

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

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

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

答案 8 :(得分:5)

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

  1. 转到属性 - &gt; Java构建路径 - &gt;来源标签
  2. 检查位于MyProject/src/main/java -> Excluded: <your_pattern>树节点
  3. 的排除模式
  4. 或者,选择节点并点击左侧的编辑... 按钮,将其设置为Excluded: (None)

答案 9 :(得分:4)

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

答案 10 :(得分:4)

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

No Persistence provider for EntityManager named mick

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

令人困惑的是,这些(下面)是我的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

由于在perjj.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>

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

答案 11 :(得分:3)

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

答案 14 :(得分:2)

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

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

它现在正在运作。

答案 15 :(得分:2)

我遇到了同样的问题,但在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(取决于使用的数据库)。

我希望这会有所帮助。

答案 16 :(得分:2)

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

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

答案 17 :(得分:1)

您需要在类路径中使用以下jar文件:

  1. antlr-2.7.6.jar
  2. 公地集合-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

答案 18 :(得分:1)

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

答案 19 :(得分:1)

Hibernate 5.2.5
Jar文件在类路径中是必需的。这是在Hibernate 5.2.5最终版本的必需文件夹中。它可以从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. hibernate-core-5.2.5.Final
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3.Final
  11. 了Javassist-3.20.0-GA
  12. javax.inject-1
  13. 的JBoss拦截-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. JS​​R250-API-1.0
  16. 中创建一个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. 请记下&lt;中提到的信息。持久性&gt;标签和版本应为2.1。
    2. 请注明名称&lt;持久单元&gt;标签,名称被称为“样本”。加载
    3. 时,此名称必须完全相同

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

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

      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
      

答案 20 :(得分:1)

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

JPA-PersistenceUnits: my-persistence-unit

否则,JPA-bundle将不知道您的包中包含持久性单元。

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

答案 21 :(得分: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,而persistence.xml正在某处缓存。我不得不重新启动服务器然后才能工作。

答案 22 :(得分:0)

当我将所有 java 类移动到不同的包时遇到了这个问题。 最后,我发现如果我更改了 myclasses 的包,那么我需要在所有引用我的 java 类的 persistence-unit/class 元素中使用新包更新 persistence.xml。

答案 23 :(得分:0)

我遇到了同样的问题,我从可以工作的bean类中删除了“ @ManagedBean”。

答案 24 :(得分:0)

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

@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)
}

GL

Source

答案 25 :(得分:0)

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

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

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

在我的情况下,以前我使用想法通过数据库模式生成实体,并且persistence.xml是在src/main/java/META-INF中自动生成的,并且根据https://stackoverflow.com/a/23890419/10701129,我将其移至{{ 1}},也将META-INF标记为源根。它对我有用。

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

,这是结构: enter image description here

答案 28 :(得分:0)

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

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

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

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

答案 29 :(得分: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**);

答案 30 :(得分:0)

我的解决方法是在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>

答案 31 :(得分:0)

如果Persistence.createEntityManagerFactory("JPAService")中不同类别中的名称不同,则会出现错误。 通过重构,可以获得不同的名称,这在我的情况下。在一个类中,Persistence.createEntityManagerFactory("JPAService")中的自动生成的private void initComponents(),ContactsTable类与DBManager类中的Persistence.createEntityManagerFactory("JPAServiceExtended")不同。