2011-04-12 8 views
14

EJB 세션 빈에 액세스 할 때 Facade Pattern을 사용하는 이유를 묻고 싶습니다. 나는>Sessions Bean for Entity ClassesNew을, 나는 User 엔티티를 선택하는 것이 가정 해 봅시다 경우 내 넷빈즈 6.9.1에서, 다음 넷빈즈EJB 세션 빈에 Facade 패턴을 사용하는 이유

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를 생성합니다. 이것은 나에게 잔인한 것 같다. 내 관리 빈 내부 어딘가에 말을하자, 내가 persistUserSchool에있는 나는이

someManagedBean.java 

... 
@EJB 
private UserFacade userEJB; 

@EJB 
private SchoolFacade schoolEJB; 

... 

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

이 옳은 일입니까 할 수있다?

답변

22

EJB를 전혀 사용하지 않는 이유는 선언적 트랜잭션 및 주석 (또는 XML 구성)을 통한 보안과 같은 기능을 제공한다는 것입니다. 이러한 기능을 사용하지 않으면 EJB가 필요하지 않습니다.

또한 자동 생성 된 외관 코드는 시작점 (및 잘못된 번호)이됩니다. EJB는 모든 개별 CRUD 작업에 대한 래퍼가 아니라 도메인 API를 형성해야합니다. 도메인 모델에서 실제로 수행 할 작업 만 포함해야하며 그 중 많은 작업이 트랜잭션 내에서 수행되어야하는 여러 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에서 가져 왔지만 다른 하나에는 추가되지 않았습니다.

+0

나는 아직도 약간 혼란 스럽다. 내가 EJB를 생성하는 이유는'persist' 나'merge' 나'Query # getResultList'와 같이 CRUD를 수행하기 위해 JPA와 상호 작용할 필요가 있기 때문입니다. 그래서이 경우 EJB를 사용해야합니다. 나는'@ Statsless' EJB btw를 사용합니다. 당신의 두 번째 단락, 어쩌면 몇 가지 샘플 코드에 대해 좀 더 자세히 설명 할 수있어서 실제 구조를 볼 수있어서 크게 감사하겠습니다. –

+2

@Harry : EJB를 사용하여 JPA를 사용할 필요가 없으며 직접 EntityManager에 액세스 할 수 있습니다. 그러나 트랜잭션을 얻기 위해 EJB를 사용하는 것이 여전히 합리적 일 수 있습니다. 예제를 추가하겠습니다. –

+0

감사합니다. 가능하다면, EJB에 대한 외관 패턴을 올바르게 구현하는 방법에 대한 예제를 추가 할 것인가? 나는 그것을 매우 높이 평가할 것이다. D –

7

예 아니오. Facade 패턴은 많은 의미를 지니지 만 도메인 객체마다 별도의 Facace를 갖는 것은 말이되지 않습니다.

도메인 개체의 기능 그룹당 facades를 그룹화 할 수 있습니다. 청구 시스템을 상상해보십시오. 청구서, 물품, 고객, 주소가 있습니다. 따라서 청구서 처리 (항목 추가, 고객 설정, 인쇄, 유료로 표시) 및 주소 생성과 관련하여 사용자 생성 및 업데이트를위한 Facade가있을 것입니다.

1

볼 수 있듯이 일반적인 CRUD 작업에는 하나의 AbstractFacade가 있어야하고 주어진 개체를 조작하기위한 많은 SpecificFacade가 있어야한다고 생각합니다. 따라서 동일한 기본 논리를 여러 번 다시 구현할 수는 없으며 ... 엔티티와 관련된보다 복잡한 논리 (트랜잭션)에만 집중하십시오.

관련 문제