javax.persistence.PersistenceException:没有名为 customerManager 的 EntityManager 的持久性提供程序

问题描述 投票:0回答:10

我是 JPA 和 Hibernate 的新手。在阅读了一些在线材料后,我现在了解了 Hibernate 是什么以及它如何与 JPA 一起使用。

现在,我正在尝试运行这个 JPA 和 Hibernate 教程。我已经完成了他们在本教程中提到的所有内容。

我没有Oracle DB,只有MySQL。所以我用我对JPA和Hibernate的理解对

persistence.xml
做了一些修改(我不知道它是否正确......在我看来是这样。)

这是我的

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
  <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>Customer</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.password" value="1234"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

但我似乎没有得到他们描述的输出。它给了我:

Customer id before creation:null
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" javax.persistence.PersistenceException: No Persistence     provider for EntityManager named customerManager
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
 at CustomerDAO.create(CustomerDAO.java:8)
 at CustomerDAO.main(CustomerDAO.java:22)

如有任何建议,我们将不胜感激。

更新:

我已按照要求进行了更改。但是,仍然出现 asme 错误行!!!

他们在该教程中没有提到任何有关 orm.xml 的内容。这可能是一个问题原因!!!

java hibernate orm jpa
10个回答
27
投票

只是为了完整性。还有一种情况会导致这个错误:

缺少 META-INF/services/javax.persistence.spi.PersistenceProvider 文件。

对于 Hibernate,它位于

hibernate-entitymanager-XXX.jar
中,因此,如果
hibernate-entitymanager-XXX.jar
不在您的类路径中,您也会收到此错误。

这个错误消息非常具有误导性,我花了几个小时才纠正它。

请参阅 JPA 2.0 使用 Hibernate 作为提供程序 - 例外:没有 EntityManager 的持久性提供程序


20
投票

您的

persistence.xml
无效,无法创建
EntityManagerFactory
。应该是:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
  <persistence-unit name="customerManager" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>Customer</class>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.connection.username" value="root"/>
      <property name="hibernate.connection.password" value="1234"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/general"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

(注意

<property>
元素是如何闭合的,它们不应该嵌套)

更新:我完成了教程,您在使用MySQL时还必须更改

Id
生成策略(因为MySQL不支持序列)。我建议使用
AUTO
策略(默认为 MySQL 的 IDENTITY)。为此,请删除
SequenceGenerator
注释并更改代码,如下所示:

@Entity
@Table(name="TAB_CUSTOMER")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="CUSTOMER_ID", precision=0)
    private Long customerId = null;

   ...
}

这应该有帮助。

PS:您还应该按照建议提供

log4j.properties


19
投票

我今天也遇到了同样的问题。我的 persistence.xml 位于错误的位置。我必须把它放在以下路径中:

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

10
投票

我也面临着同样的问题。我意识到我在 persistence.xml 中使用了错误的提供程序类

对于 Hibernate 来说应该是

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

对于 EclipseLink 来说应该是

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

5
投票

如果您使用 Hibernate 5.2.10.Final,则应该更改

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

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

在你的 persistence.xml 中

根据 Hibernate 5.2.2:EntityManager 没有持久化提供程序


1
投票

如果您使用 Maven,您可能拥有 both

src/{main,test}/resources/META-INF/persistence.xml
。这是一种常见的设置:使用 h2 或 Derby 测试您的 JPA 代码,然后使用 PostgreSQL 或其他一些完整的 DBMS 进行部署。如果您使用此模式,请确保这两个文件具有不同单位名称,否则某些版本的
Persistence
类将尝试加载两者(因为当然,您的测试时 CLASSPATH 包括类和测试-类);这将导致持久性单元的定义发生冲突,从而导致我们都非常讨厌的可怕而烦人的消息!

更糟糕的是:这可能对某些旧版本(例如 Hibernate)“有效”,但对当前版本则失败。无论如何,值得把它做好......


0
投票

有点太晚了,但我遇到了同样的问题,并修复了它,将 schemalocation 切换到 persistence.xml 文件中的 schemaLocation(第 1 行)。


0
投票

我看到了这个错误,对我来说问题是 persistance.xml 的绝对路径中有一个空格,删除它对我有帮助。


0
投票

当我尝试在 Tomcat 8 中配置 JPA 实体管理器时,我也遇到了同样的问题。首先,我遇到了未找到 SystemException 类的问题,因此未创建entityManagerFactory。我删除了休眠实体管理器依赖项,然后我的entityManagerFactory无法查找持久性提供程序。经过大量研究和时间后,我们知道 Hibernate 实体管理器必须查找某些配置。然后放回实体管理器 jar,然后添加 JTA Api 作为依赖项,它工作正常。


-1
投票

我的经验告诉我,缺少 persistence.xml,也会生成相同的异常。

今天我尝试运行 ant 打包的 jar 包时,发现了同样的错误消息。

当我使用jar tvf检查jar文件的内容时,我意识到“ant”忘记为我打包persistnece.xml。

我手动重新打包jar文件后,错误消息消失了。

所以我相信也许你应该尝试简单地将 META-INF 放在 src 目录下并将 persistence.xml 放在那里。

© www.soinside.com 2019 - 2024. All rights reserved.