jakarta-ee - 为什么对 EJB session bean 使用 Facade 模式

标签 jakarta-ee netbeans ejb facade

我想问一下在访问EJB Session Bean时使用Facade Pattern的原因是什么?在我的 Netbeans 6.9.1 中,如果我这样做 New > Sessions Bean for Entity Classes ,假设我选择 User实体,然后 Netbeans 将生成此代码

AbstractFacade.java
public abstract class AbstractFacade<T> {
    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public T edit(T entity) {
        return getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

    public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }

    public List<T> findRange(int[] range) {
        ...
    }

    public int count() {
        ...
    }


UserFacade.java    

package com.bridgeye.ejb;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class UserFacade extends AbstractFacade<User> {
    @PersistenceContext(unitName = "Bridgeye2-ejbPU")
    private EntityManager em;

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

    public UserFacade() {
        super(User.class);
    }        
}

我想问一下这样做有什么好处。如果我有 10 个实体,那么 Netbeans 将生成 10 个 Facade 类和 AbstractFacade。这对我来说似乎太过分了。假设在我的托管 bean 中的某个地方,我必须persist UserSchool那么我已经这样做了
someManagedBean.java

...
@EJB
private UserFacade userEJB;

@EJB
private SchoolFacade schoolEJB;

...

public void someMethod(User user, School school){
    ...
    userEJB.create(user);
    schoolEJB.create(school);    
}

这是正确的做法吗?

最佳答案

使用 EJB 的关键在于它们通过注释(或 XML 配置)提供了诸如声明性事务和安全性等特性。如果您不使用这些特性,那么使用 EJB 就毫无意义。

此外,自动生成的外观代码只是一个起点(也是一个糟糕的起点)。 EJB 应该形成一个域 API,而不是所有单个 CRUD 操作的包装器。它们应该只包含您实际想要在域模型上执行的操作,并且其中许多应该跨越多个需要在事务中执行的 CRUD 操作。例如:

@TransactionAttribute
public void transferUser(User u, School from, School to){
    from.getUsers().remove(u);
    to.getUsers().add(u);
    u.setSchool(to);
    getEntityManager().merge(from);
    getEntityManager().merge(to);
    getEntityManager().merge(u);
}

应用程序服务器将执行事务中的所有操作,例如,这可确保您不会出现由于某种原因引发异常的情况,最终导致用户从一个 Schoold 中删除但未添加到另一个 Schoold .

关于jakarta-ee - 为什么对 EJB session bean 使用 Facade 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636764/

相关文章:

java - 注入(inject)的 CDI Bean 返回 null 值

java - 如何使用 JAX-RS 捕获所有无效 URL?

java - 如何在java中录制声音时减少噪音?

java - JPA2——如何自动删除 `many`一侧的单向多对一映射数据?

java - weblogic部署InternalException : Transaction marked rollback or not expected transaction

rest - 当我创建新的 RESTful Web 服务时,Netbeans 不会创建 ApplicationConfig.java

java - 如何从mysql获取Set数据类型到java

java - 解析 Set-Cookie header 的 firefox 源代码的位置?

git - refs/heads/master :refs/heads/master mean? 是什么意思

java - 使用 JNA 构建 C 项目时遇到问题