簡體   English   中英

錯誤:Hibernate 5.3.0.Beta1下的“沒有EntityManager的持久性提供程序”

[英]Error: 'No Persistence provider for EntityManager' under Hibernate 5.3.0.Beta1

在Eclipse中,我設置了一個新的maven項目,我想嘗試一些數據庫連接。 所以我創建了一個User.java,它是我的實體和DataBaseConnector.java ,我在那里嘗試db連接,但是我收到一個錯誤:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named mysql-database
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at database.DataBaseConnector.getTestConnection(DataBaseConnector.java:21)
at database.DataBaseConnector.main(DataBaseConnector.java:14)

我當前版本的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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_2_0.xsd"
             version="2.0">

    <persistence-unit name="mysql-database" transaction-type="RESOURCE_LOCAL">
        <description>DataBase Connection</description>

        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <validation-mode>NONE</validation-mode>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sharifo" />
            <property name="javax.persistence.jdbc.user" value="admin" />
            <property name="javax.persistence.jdbc.password" value="1234" />

            <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"  /-->
            <!-- <property name="hibernate.show_sql" value="true"  /-->
            <!-- <property name="hibernate.hbm2ddl.auto" value="create" /-->
        </properties>

    </persistence-unit>

</persistence>

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>backend</groupId>
  <artifactId>shareifo</artifactId>
  <version>0.0.1</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.3.0.Beta1</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.2.Final</version>
    </dependency>


     <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.8-dmr</version>
    </dependency>
  </dependencies>

</project>

我覺得persistence.xml可能配置錯誤,所以我也在github上傳了我的項目: https//github.com/ViFire/sherifo-backend.git

我不知道如何修復或處理此錯誤。 你有我的小竅門嗎?

我通過您提供的GitHub項目鏈接檢查了代碼。 必須改變兩件事:

  1. pom.xml刪除現在過時的依賴項:

     <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.2.Final</version> </dependency> 

    注意 :不再需要此依賴項,甚至可能在運行時混淆,因為Hibernate 5.3.xyz現在依賴於javax.persistence:javax.persistence-api:2.2 ,官方JPA 2.2 規范 -jar。

  2. 更改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="mysql-database" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <validation-mode>NONE</validation-mode> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sharifo" /> <property name="javax.persistence.jdbc.user" value="admin" /> <property name="javax.persistence.jdbc.password" value="1234" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <!-- <property name="hibernate.show_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create"/> --> </properties> </persistence-unit> </persistence> 

    注意

    • (a)標題中的不同xmlns和JPA版本(2.1),
    • (b) provider是: org.hibernate.jpa.HibernatePersistenceProvider
    • (c) jdbc.driver是: com.mysql.cj.jdbc.Driver

意見

在調試/測試時,我發現Hibernate的5.3.0.Beta1版本似乎與最新的穩定版本不同: 5.2.17.Final 您觀察到的“誤導性”錯誤消息將被拋出,即使所有內容都按上述方式設置。

對我來說這有一個簡單的原因:如果數據庫無法訪問或憑據不正確,您還會遇到以下消息:

沒有名為xyz的EntityManager的持久性提供程序...

這是 - 恕我直言 - 在這種情況下完全混淆。 使用Hibernate 5.2.x .Final,您會在失敗的連接嘗試時收到錯誤消息,包括一個更精確的調試輸出,用於准確查找內容。

由於上述原因: 仔細檢查用戶/ pw,JDBC url / hostname是否正確,因為這可能會導致一個令人困惑的錯誤消息,即對於實際可用並正確配置的持久性單元,不存在持久性提供程序。

作為獎勵,我將在您的GitHub項目上打開一個Pull請求(PR),您可以查看詳細信息。 我希望您將此PR整合到您的項目中,以便您直接受益。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM