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 的最新依赖项重新生成它们的重要性=]