JPA Hibernate 登录到 IntelliJ 中的本地 MySQL 不工作
JPA Hibernate login to local MySQL in IntelliJ not working
我是 Jakarta EE 的新手,我看到了其他一些类似的问题,我已经关注了它们,但似乎看不出我做错了什么,因为我已经关注了所有这些问题。
似乎找不到 class 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好像复杂了点。
我看了这么多资源,看不出我做错了什么,所以我决定问一个问题,如果重复,我提前道歉,
只是我关注的最多
小修改:如果通过数据源或其他方式更容易连接,我也愿意,但如果可能的话我更愿意以编程方式进行。
我假设您正在部署到 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 名称,因为应用程序服务器提供开箱即用的连接池和与数据源的事务集成。
问题出在 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"/>
这就是为什么在 Whosebug 上提问时提供完整错误而不是部分屏幕截图很重要的原因。
第二个可能的问题是缺少 JDBC 驱动程序。在这种情况下,错误会有所不同:
Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
如果您遇到 MySQL JDBC 驱动程序 class 未找到的问题,请确保该 jar 包含在您正在部署的工件中:
如果使用此依赖项更新 pom.xml
:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
然后删除 IntelliJ IDEA 和 中的工件,将自动创建新的工件,其中已添加 JDBC 驱动程序:
请注意 IDE 不会在 Maven 重新导入时更新工件,它是 known limitation。这就是为什么 首先删除现有工件 并从 Maven 重新导入项目以使用来自 pom.xml
.[=23 的最新依赖项重新生成它们的重要性=]
我是 Jakarta EE 的新手,我看到了其他一些类似的问题,我已经关注了它们,但似乎看不出我做错了什么,因为我已经关注了所有这些问题。
似乎找不到 class 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好像复杂了点。 我看了这么多资源,看不出我做错了什么,所以我决定问一个问题,如果重复,我提前道歉, 只是我关注的最多
小修改:如果通过数据源或其他方式更容易连接,我也愿意,但如果可能的话我更愿意以编程方式进行。
我假设您正在部署到 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 名称,因为应用程序服务器提供开箱即用的连接池和与数据源的事务集成。
问题出在 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"/>
这就是为什么在 Whosebug 上提问时提供完整错误而不是部分屏幕截图很重要的原因。
第二个可能的问题是缺少 JDBC 驱动程序。在这种情况下,错误会有所不同:
Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.mysql.jdbc.Driver
如果您遇到 MySQL JDBC 驱动程序 class 未找到的问题,请确保该 jar 包含在您正在部署的工件中:
如果使用此依赖项更新 pom.xml
:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
然后删除 IntelliJ IDEA 和
请注意 IDE 不会在 Maven 重新导入时更新工件,它是 known limitation。这就是为什么 首先删除现有工件 并从 Maven 重新导入项目以使用来自 pom.xml
.[=23 的最新依赖项重新生成它们的重要性=]