如何解决JPA Hibernate 在 IntelliJ 中登录到本地 MySQL 不起作用
我是 Jakarta EE 的新手,我看到了其他一些类似的问题,我已经关注了它们,但似乎看不出我做错了什么,因为我已经关注了所有这些问题。
好像没有找到com.MysqL.jdbc.Driver这个类。我把头撞在墙上试图找出原因
我正在使用 hibernate 学习 JPA,但似乎无法从 MysqL 连接到我的本地主机。
我在 pom.xml
中添加了依赖项:
<?xml version="1.0" encoding="UTF-8"?>
<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>com.example</groupId>
<artifactId>Jakarta2</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Jakarta2</name>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.7.0</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>javax.ejb</groupId>
<artifactId>javax.ejb-api</artifactId>
<version>3.2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.25.Final</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/MysqL/mysql-connector-java-->
<dependency>
<groupId>MysqL</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
</project>
persistence.xml
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<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_2.xsd"
version="2.2">
<persistence-unit name="MyFirstEntityManager" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MysqL8Dialect"/>
<property name="javax.persistence.jdbc.driver" value="com.MysqL.jdbc.Driver"/>
<-- also tried com.MysqL.cj.jdbc.Driver (made no difference) -->
<property name="javax.persistence.jdbc.url" value="jdbc:MysqL://localhost/Test"/>
<property name="javax.persistence.jdbc.username" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
</properties>
</persistence-unit>
</persistence>
AnimalsServlet.java
:
package animals;
import javax.persistence.Entity;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import myServices.HtmlHandler;
@WebServlet("/animals")
public class AnimalsServlet extends HttpServlet {
@Override
protected void doGet(request,response) throws servletexception,IOException
{
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("MyFirstEntityManager");
}
}
在这一点上我已经放弃了,Java 似乎不必要地复杂。 看了这么多资源,都看不出哪里做错了,所以决定问一个问题,如果是重复,请提前道歉, 只是我关注的最多。
小编辑:如果通过数据源或其他方式更容易连接,我也对此持开放态度,但如果可能,我更愿意以编程方式进行。
解决方法
问题在于 persistence.xml
文件:
<property name="javax.persistence.jdbc.username" value="root"/>
此属性不正确且您未设置导致以下异常的用户名:
Caused by: java.sql.SQLException: Access denied for user ''@'localhost' (using password: YES)
解决方案是使用正确的 javax.persistence.jdbc.user
属性:
<property name="javax.persistence.jdbc.user" value="root"/>
这就是为什么在 StackOverflow 上提问时提供完整错误而不是部分屏幕截图很重要。
第二个可能的问题是缺少 JDBC 驱动程序。在这种情况下,错误会有所不同:
Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
如果您遇到 MySQL JDBC Driver 类未找到的问题,请确保该 jar 包含在您正在部署的工件中:
如果您使用此依赖项更新 pom.xml
:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
然后在 IntelliJ IDEA 和 reimport the project 中删除工件,新工件将使用已添加的 JDBC 驱动程序自动创建:
请注意,IDE 不会在 Maven 重新导入时更新工件,它是一个 known limitation。这就是为什么首先删除现有工件并从 Maven 重新导入项目以使用来自 pom.xml
的最新依赖项重新生成它们很重要的原因。
我假设您要部署到 Glassfish?请注意,Glassfish 中的默认实现是 EclipseLink,它已经与它捆绑在一起。 Java/Jakarta EE 应用程序通常只需要依赖于 API 工件,例如jakartaee-api
:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>8.0.0</version>
<scope>provided</scope>
</dependency>
违背默认实现可能会导致麻烦,因为这是一项并不总是那么容易实现的集成工作。
您是否检查过部署到 Glassfish 的 WAR 文件在 WEB-INF/lib 中是否包含 mysql jdbc JAR?无论如何,我建议您在 Glassfish 中设置一个数据源,并在 persistence.xml 中使用 JNDI 名称,因为应用程序服务器提供开箱即用的连接池和与数据源的事务集成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。