2012-03-30 4 views
1

현재 트랜잭션 뷰 패턴을 사용하여 뷰에서 컬렉션의 지연로드를 가능하게합니다.JPA 지연로드 JSF 뷰의 콜렉션 - 필터 사용보다 나은 방법?

나는 그럼 난 다음 (오히려 인위적인) 백업 콩을 가정

public class ViewFilter implements Filter { 
    @Resource UserTransaction tx; 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    try { 
     tx.begin(); 
     chain.doFilter(request, response); 
    } 
    //catch here 
    finally { 
     //another try-catch 
     tx.commit(); 
    } 
    } 
} 

...은 web.xml

<filter> 
    <filter-name>view</filter-name> 
    <filter-class>com.jasoni.ViewFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>view</filter-name> 
    <url-pattern>*.xhtml</url-pattern> 
</filter-mapping> 

에 다음과 필터 클래스는 다음과 같은했다가

@ManagedBean 
@RequestScoped 
public class DepartmentEmployees { 
    @EJB 
    private DepartmentServiceBean deptService; 
    @ManagedProperty(value="#{param.deptId}") 
    private Integer deptId; 
    private Department dept; 

    @PostConstruct 
    public String init() { 
    dept = deptService.findById(deptId); 
    } 
} 

내보기 (.xhtml 파일)에서 이와 비슷한 작업을 수행 할 수 있습니다.

<ul> 
<c:forEach var="emp" items="#{departmentEmployees.dept.employees}"> 
    <li>#{emp.firstName} #{emp.lastName}</li> 
</c:forEach> 
</ul> 

누군가 필터 (또는 서블릿)를 사용하지 않고 동일한 것을 달성하는 다른 방법을 알고 있는지 궁금합니다.

답변

5

이 접근법 ("열린 세션보기")에는 몇 가지 주요 단점이 있습니다. JSF 페이지를 렌더링하는 동안 발생하는 "실제"예외를 적절히 처리 할 수있는 옵션이 많지 않습니다. (물론 비즈니스 세션을 제어하는 ​​서블릿 필터의 디자인 아이디어가 아닙니다.

인프라/기술 스택에 대해 많이 쓰지는 않지만 Java EE 6 서버에 있다고 가정합니다.

나는 보통 확장 모드에서 EntityManger을 사용하고 비즈니스 방식의 특정 방법에만 주석을 달아 명시 적으로 제어하는 ​​트랜잭션으로 플러시합니다.

@Stateful 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class BookFacadeBean implements BookFacade { 
    @PersistenceContext(type=PersistenceContextType.EXTENDED) 
    private EntityManager em; 
    private Book currentBook; 

    public Book find(long id){ 
     this.currentBook = this.em.find(Book.class, id); 
     return this.currentBook; 
    } 
    public void create(Book book){ 
     this.em.persist(book); 
     this.currentBook = book; 
    } 
    public Book getCurrentBook() { 
     return currentBook; 
    } 
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void save(){ 
     //nothing to do here 
    } 
} 

이 방법에서의 다음 단계는 CDI 대화 범위에 EntityManager를 결합하는 것입니다 : (Adam Bien - Real World Java EE Patterns, Rethinking Best Practices에서 가져온)이 예에서보세요. 해당 주제에 대한 자세한 내용은 (a) Weld (b) Seam 3 Persistence을 참조하십시오.

자세한 방법보다는 대체 방법에 대한 대략적인 스케치입니다. 이 정보의 수준이 당신이 묻고있는 것임을 알기를 바랍니다. 추가 질문을 요청하십시오. :-)

+0

안녕하세요, 1 월 감사합니다. 예, Java EE 서버 (JBoss)를 사용하고 있으며 JBoss와 관련된 많은 일을하지 않으려합니다. Stateless Session Beans와 비슷한 접근법이 있습니까? – JasonI

+0

글쎄, 제가 게시 한 내용은 JBoss에만 국한된 것이 아닙니다. 이식성은 느슨하지 않을 것입니다 (Weld는 기본 CDI 구현이며 Seam 3는 일반 CDI 확장입니다). 하지만이 방법은 상태 저장이므로 SLSB로 구현할 수는 없습니다. 그러나 주를 두려워하지 말고, 그들에 대해 나쁜 점은 없습니다. –

+0

알았어, 정보 주셔서 감사합니다. Weld와 Seam3을 살펴보기로하자. – JasonI

관련 문제