我想問一下在訪問EJB Session Bean時使用Facade模式的原因是什麼。在我的Netbeans 6.9.1,如果我做New
>Sessions Bean for Entity Classes
,讓說,我選擇User
實體,然後Netbeans的將生成的代碼爲什麼使用Facade模式的EJB會話bean
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的原因是因爲我需要與JPA交互來執行CRUD,比如'persist'或'merge'或'Query#getResultList',所以在這種情況下,我應該使用EJB。我使用'@ Statsless' EJB順便說一句。你能詳細說一下你的第二段,也許是一些示例代碼,所以我可以看到實際的結構,將不勝感激。 – 2011-04-12 14:49:53
@Harry:你不需要使用EJB來使用JPA,你可以直接訪問EntityManager。但是使用EJB獲取事務可能還是有意義的。我會添加一個例子。 – 2011-04-12 14:59:25
謝謝。如果可能的話,你會添加一個如何正確實現EJB的facade模式的例子嗎?我將不勝感激它:D – 2011-04-12 15:02:47