Jakarta ee 在连接到web模块中的JSF CDIBean之后,EJB模块中注入CDI的EntityManager是否可以传递?

Jakarta ee 在连接到web模块中的JSF CDIBean之后,EJB模块中注入CDI的EntityManager是否可以传递?,jakarta-ee,primefaces,ejb-3.0,cdi,entitymanager,Jakarta Ee,Primefaces,Ejb 3.0,Cdi,Entitymanager,我有一个web模块和一个ejb模块打包到一个EAR中 我有JSF支持bean成功地从ejb模块注入会话ejb,这些ejb模块能够从数据库中提取数据,例如 @RequestScoped public class CarController { @EJB private CarService carService; 为了支持Primefaces LazyDataModel,会话EJB将其EntityManager公开给LazyDataModel: @PostConstruct p

我有一个web模块和一个ejb模块打包到一个EAR中

我有JSF支持bean成功地从ejb模块注入会话ejb,这些ejb模块能够从数据库中提取数据,例如

@RequestScoped
public class CarController {

    @EJB
    private CarService carService;
为了支持Primefaces LazyDataModel,会话EJB将其EntityManager公开给LazyDataModel:

@PostConstruct
public void init() {
    MyLazyDataModel<Car> myLazyDataModel = new MyLazyDataModel<Car>();
    myLazyDataModel.setEntityManager(carService.getEntityManager());
    super.setMyLazyDataModel(myLazyDataModel);
}

这是不是因为PersistenceContext只是在ejb模块中传递的有效bean而不起作用?

为了资源和/或ejb注入的目的,使用JSF bean或CDI bean是等效的

我将避免在同一应用程序中以两种不同的方式(即通过PersistenceContext注入和通过EntityManagerFactory)检索EntityManager。尤其是EntityManagerFactory实例化是一个重量级操作

如果将
MyLazyDataModel
作为一个匿名的内部类,那么就容易多了,因为您可以直接使用注入的DAO服务,而不需要直接在bean中处理EntityManager。你可以从中看到一个具体的例子

与具体问题无关,最适合惰性数据表的bean范围似乎至少是viewscope(仅适用于jsf bean)

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName null
at    com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:132)
at    com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:173)
at   com.sun.enterprise.container.common.impl.EntityManagerWrapper.getCriteriaBuilder(EntityManagerWrapper.java:895)
at com.cars.web.controller.MyLazyDataModel.load(MyLazyDataModel.java:154)
at org.primefaces.component.datatable.DataTable.loadLazyData(DataTable.java:731)