我想问一下在访问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
User
和 School
那么我已经这样做了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/