我有以下项目:
文件 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());
}
}
}
它可以毫无问题地工作,准确地输出我在数据库中的内容。
所以“本地”我可以毫无问题地使用 JPA 文件,但是当我尝试创建一个 EJB 和 EJB 客户端来做与 main.Main 文件相同的事情时,我得到一个错误。
EJB 位于 pachet.EmployeeSession(接口)中
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,我在另一个项目中创建了一个独立的客户端。
客户端只有一个类,如下:
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(默认包中的这个)时,我得到以下输出
可以看出,连接到 EJB 没有问题,因为 thing.test(); 它返回“作品”定义运行,我认为客户端所需的库没有问题,但之后出现异常。
可以看出 EclipseLink 没有找到 com.mysql.jdbc.Driver 的延续。
所以问题是:EJB 项目中的 main.Main 怎么可能正确运行并显示来自 db 的信息,而来自 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 'business' 代码) }
可以看出,从客户端调用的两种方法都有效。这意味着问题是因为 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>