在Eclipse中,我设置了一个新的maven项目,我想尝试一些数据库连接。所以我创建了一个User.java,它是我的实体和DataBaseConnector.java
我尝试数据库连接,但是我收到一个错误:
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
我不知道如何修复或处理此错误。你有什么秘诀吗?
答案 0 :(得分:2)
我通过您提供的GitHub项目链接检查了代码。必须改变两件事:
从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。
更改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>
注意,
provider
是:org.hibernate.jpa.HibernatePersistenceProvider
,jdbc.driver
是:com.mysql.cj.jdbc.Driver
。在调试/测试时,我发现Hibernate的 5.3.0.Beta1 版本似乎与最新的稳定版本不同: 5.2.17.Final 。您观察到的“误导性”错误消息将被抛出,即使所有内容都按上述方式设置。
对我而言,这有一个简单的原因:如果无法访问数据库或凭据不正确,您还会遇到以下消息:
没有名为xyz的实体管理器的持久性提供程序...
这是 - 恕我直言 - 在这种情况下完全令人困惑。使用Hibernate 5.2.x .Final,您会在失败的连接尝试时收到错误消息,包括更精确的调试输出,以查找准确查找的内容。
由于上述原因:仔细检查用户/ pw,JDBC url / hostname是否正确,因为这可能会导致一个令人困惑的错误消息,即不存在持久性提供程序实际可用且配置正确的持久性单元。
作为奖励,我将在您的GitHub项目上打开一个Pull请求(PR),您可以查看详细信息。我希望您将这个PR整合到您的项目中,这样您就可以直接受益。
希望它有所帮助。