2014-06-12 2 views
4

GWT, Oracle db, Glassfish 서버, JPA를 사용하고 있습니다. 클라이언트 측에서 아무런 문제가 없습니다. 또한 서버 측에서 Facade 패턴을 사용합니다.Facade 패턴에서 namedQuery를 작성하는 코드는 어디에 두어야합니까?

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 void edit(T entity) { 
    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) { 
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
    cq.select(cq.from(entityClass)); 
    javax.persistence.Query q = getEntityManager().createQuery(cq); 
    q.setMaxResults(range[1] - range[0] + 1); 
    q.setFirstResult(range[0]); 
    return q.getResultList(); 
} 

public int count() { 
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
    javax.persistence.criteria.Root<T> rt = cq.from(entityClass); 
    cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
    javax.persistence.Query q = getEntityManager().createQuery(cq); 
    return ((Long) q.getSingleResult()).intValue(); 
} 

GroupFacade.java

@Stateless 
public class GroupsFacade extends AbstractFacade<Groups> implements GroupsFacadeLocal { 
    @PersistenceContext(unitName = "exam_ejb_1.0PU") 
    private EntityManager em; 

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

    public GroupsFacade() { 
     super(Groups.class); 
    } 
} 

GroupsFacadeLocal.java

@Local 
public interface GroupsFacadeLocal { 

    void create(Groups groups); 

    void edit(Groups groups); 

    void remove(Groups groups); 

    Groups find(Object id); 

    List<Groups> findAll(); 

    List<Groups> findRange(int[] range); 

    int count(); 

} 

Groups.java

그래서 db를 만들거나 모든 레코드를 찾는 데 아무런 문제가 없었습니다.

public class ServiceImpl extends RemoteServiceServlet implements Service { 
     @EJB 
      AtsTestJautajumsGrupasFacadeLocal grupasEJB; 
     @Override 
      public List<Groups> getCategories() { 

       List<Groups> grupas = new ArrayList<Groups>(); 
       grupas = grupasEJB.findAll(); 

       return grupas; 
      } 

하지만 이제는 동일한 Test_id의 그룹을 선택해야합니다. @NamedQuery(name = "Grous.findByTestId"...을 만들었으며 지금은 조금 잃어 버렸습니다.

내 질문은 : 어떻게 그 NamedQuery를 사용합니까? db에 액세스하는 메소드는 어디서 만들 수 있습니까? ServiceImpl에서 해당 메소드에 액세스해야한다. 이것을하는 올바른 방법은 무엇입니까?

EDITED : 하나 더 질문드립니다. 언제 그리고 왜 당신이 제안한 것 대신에 CriteriaBuilder를 사용해야합니까? 예 :

답변

1

정확히 어떻게 작품을 작업하고 코드를 작성했는지는 모르겠지만 기본적으로 다음 샘플에는 필요한 모든 것이 포함되어 있다고 생각합니다.

public List<Groups> getCategoriesByTestId(Test test){ 
    return em().createNamedQuery("Grous.findByTestId", Groups .class).setParameter("TestId", test.getId()).getResultList(); 
} 

그리고 당신의 방법은 당신이 (당신의 코드에서 ServiceImpl에서는 것으로 보인다), 및 모든 데이터베이스를 처리하는 DAO에 메소드를 구현 사용하는 서비스를 호출 할 필요는에 GroupsFacade 것 같다있는 (JPA에 액세스 귀하의 코드). GroupsFacadeLocal에서 메소드 프로토 타입을 선언하는 것을 잊지 마십시오. 내가 당신의 코드를 잘 이해한다면 그게 다라고 생각합니다.

+0

감사합니다. 모든 것이 이제 내가 원하는대로 작동합니다. 실제로 그것은 쉬웠다, 아마 나는 어제 너무 피곤했다. – Belamors

+0

질문이 하나 더 있습니다. 언제 그리고 왜 당신이 제안한 것 대신에 CriteriaBuilder를 사용해야합니까? – Belamors

+0

미안하지만 CriteriaBuilder에 대해 염두에 두지는 않습니다 ...하지만이 방법은 다른 방법 일뿐입니다. – RadASM

관련 문제