mysql - 找不到类 [com.mysql.jdbc.Driver]

标签 mysql jakarta-ee jpa ejb client

我有以下项目:

enter image description here

文件 model.Clienti 是一个“JPA 实体”,main.Main 是一个具有 main 方法的 pojo,它是 model.Clienti 文件的客户端。 main.Main有以下代码:

package main;


import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import model.Clienti;

public class Main {
    public static void main(String[] args) {

        EntityManager entityManager = Persistence.createEntityManagerFactory("JPATestEJB").createEntityManager();
        List<Clienti> list = entityManager.createQuery("select c from Clienti c", Clienti.class).getResultList();

        for (Clienti clienti : list) {
            System.out.println(clienti.getNume());
        }
    }

}

它工作没有问题,输出的正是我在数据库中的内容。

enter image description here

因此,“本地”我可以毫无问题地使用 JPA 文件,但是当我尝试创建 EJB 和 EJB 客户端来执行与 main.Main 文件相同的操作时,我收到错误。

EJB位于pachet.EmployeeSession(接口(interface))中

package pachet;

import javax.ejb.Remote;

@Remote
public interface EmployeeSession {
    public String getEmplastname(Integer empno);

    public String test();
}

和 EmployeeSessionBean

package pachet;

import java.util.List;

import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import model.Clienti;

@Stateless
public class EmployeeSessionBean implements EmployeeSession {

    public String getEmplastname(Integer empno) {

        try {
            EntityManager em = Persistence.createEntityManagerFactory("JPATestEJB").createEntityManager();

            List<Clienti> list = em.createQuery("select c from Clienti c", Clienti.class).getResultList();

            for (Clienti clienti : list) {
                System.out.println(clienti.getNume());
            }
        } catch (EJBException e) {
            e.printStackTrace();
        }
        return "a mers";
    }

    public String test() {
        return "works";
    }


}

对于这个 EJB,我在另一个项目中创建了一个独立的客户端。 enter image description here

客户端只有一个类,如下:

import javax.naming.InitialContext;

import pachet.EmployeeSession;

public class Main {


    public static void main(String[] args) {


        try {
            InitialContext ic = new InitialContext();
            EmployeeSession thing = (EmployeeSession) ic.lookup("pachet.EmployeeSession");
            System.out.println(thing.test());
            System.out.println("It seems it runs: " + thing.getEmplastname(1));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

然而,当我尝试运行 Main(来自默认包的这个)时,我得到以下输出 enter image description here

可以看出,自从 thing.test(); 连接到 EJB 没有问题。它返回“works”明确地运行,我认为客户端所需的库没有问题,但之后会出现异常。

enter image description here

继续,可以看到 EclipseLink 找不到 com.mysql.jdbc.Driver。

所以问题是:EJB 项目中的 main.Main 怎么可能正确运行并显示数据库中的信息,而 ejb 客户端中的 Main 却不能。

更准确地说,问题出在 EJB EmployeeSessionBean 中,如果它具有以下结构:

package pachet;

import java.util.List;

import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import model.Clienti;

@Stateless
public class EmployeeSessionBean implements EmployeeSession {

    public String getEmplastname(Integer empno) {

        try {
           String b = "nothing"; 
        } catch (EJBException e) {
            e.printStackTrace();
        }
        return "a mers";
    }

    public String test() {
        return "works";
    }

具有以下输出:(请注意,我删除了所有 JPA“业务”代码) enter image description here }

可以看出客户端调用的两种方法都有效。这意味着问题是因为 ejb EmployeeSessionBean 无法像 main.Main 文件一样使用 JPA,但问题是为什么?它们肯定在同一个项目中,可以看出我有所需的库 EclipseLink 和 mysql-jdbc。

如果其中一个错误,那么 main.Main 也将无法连接,对吧? ' 感谢您抽出时间。

这是我的 persistence.xml 文件,虽然它似乎工作正常。 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    <class>model.Clienti</class>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/comenzi"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value=""/>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    </properties>

</persistence-unit>

最佳答案

您需要将 MySQL jar 部署到 Glassfish 服务器。要么将其与您的应用程序一起部署,要么将其放在服务器上的 applib 目录中。

通常在 Glassfish 中会使用服务器数据源而不是直接使用 JDBC,因此您可能也想尝试一下。

关于mysql - 找不到类 [com.mysql.jdbc.Driver],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616158/

相关文章:

php - 如何从 mysql 数据库中回显第 1...n 列,除了 php 中的第一个列?

mysql - 在左连接上别名列名

java - Jakarta/Java EE 兼容性如何工作?

orm - EclipseLink 生成笛卡尔计划而不是 SQL 中的(内部)联接。为什么?

java - Spring Data JPA 使用级联保存导致 EntityExistsException

mysql - 预处理后使用logstash将数据从MySQL导入到elasticsearch

javascript - 如何使用数据库连接制作动态 amchart?

java - Rabbitmq状态检查

java - 语句被中止,因为它会导致唯一或主键约束中出现重复的键值

spring - 我已将 @Transactional 放入方法中,但它仍然在回滚之前提交事务