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");
    
            
        }
    
    }        

This is the project structure where I have added the library from maven

Here I can see the mysql connector added to the external libraries folder

Exception thrown on web browser

Error on the server

Library added to project structure

在这一点上我已经放弃了,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 包含在您正在部署的工件中:

artifact

如果您使用此依赖项更新 pom.xml

          <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.23</version>
          </dependency>

然后在 IntelliJ IDEA 和 reimport the project 中删除工件,新工件将使用已添加的 JDBC 驱动程序自动创建:

JDBC added

请注意,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 名称,因为应用程序服务器提供开箱即用的连接池和与数据源的事务集成。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...