有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

EJB无状态会话bean中的javacdibeanproducer

假设我有一个名为db utils的简单库,它有一个CrudService CDI bean(requestScoped),我的web应用程序使用它来执行CRUD操作

我还有一个名为grad db的EJB项目,该项目将实体从数据库中映射。Grad db还拥有用于在db utils的CrudService中设置entityManager的生产者

我已经试过了,显然效果不错。我的问题是:这是一种糟糕的做法吗?在无状态会话bean中生成CDIBean并将EJB无状态bean作为参数传递给CrudService是否会产生任何后果

我的代码:

EJB Bean(grad db):

@Stateless
public class CrudServiceCae extends AbstractCrud implements Serializable {
    private static final long serialVersionUID = 1L;

    @PersistenceContext(unitName = "cae-pu")
    EntityManager em;

    @Override
    public EntityManager getEntityManager() {
        return em;
    }

    @Produces
    @Database(Schema.CAE)
    public CrudService createCrudServiceCou() {
        return new CrudService(this);
    }
}

CrudService(数据库utils):

@Named("crudService")
public class CrudService implements Serializable {

    private static final long serialVersionUID = -2607003150201349553L;

    private AbstractCrud crud;

    public CrudService(AbstractCrud abstractCrud) {
        this.crud = abstractCrud;
    }

    ...
}

编辑: 实际上,它只适用于查询。当我试图插入数据时,我得到了javax。坚持不懈TransactionRequiredException。显然,在这种情况下,我将不得不使用继承而不是CDI


共 (1) 个答案

  1. # 1 楼答案

    EJB负责业务流程/逻辑(即:方法),并且能够协调其他CDI控制器,这并不常见,让EJB创建对象,因为您更喜欢CDI POJO生产者

    在您的例子中,使用CDI对象并从那里生成所需的对象更容易,看起来像DAO,可以用于(我的意思是注入)EJB

    根据边界模式考虑EJB,使用专门的控制器

    注:

    • @无状态不需要实现Serializable,它们是池化的,其生命周期不允许序列化
    • 一般来说,您不想使用EJB的实体管理器的getter,您应该更喜欢编写一个方法,并在内部使用em
    • 如果使用JTA,持久性上下文更容易操作
    • 您的@Stateless应该开始事务,并让它们沿着控制器传播
    • 带有包可见性的em是个好主意,可以让你轻松地模拟你的外观/边界