2014-07-26 3 views
0

JPA에서 Open EntityManager In보기 패턴을 구현하는 방법을 찾고 있습니다. 그러나 찾을 수있는 것은 모두 최대 절전 모드 (보기에서 열린 세션) 또는 봄에 대한 것입니다.Java EE 용 JPA에서보기로 열린 EntityManager

JPA 및 Java EE의보기 패턴에서 Open EntityManager를 구현하는 방법에 대해 (가능한 경우 코드를 사용하여) 예제를 제공 할 수 있습니까?

답변

3

이러한 구현에 대한 좋은 설명은 매우 권장되는 Pro JPA 2 Book, 6 장, '분리 피하기'항목을 참조하십시오.

나는 힌트를주기 위해 노력할 것이지만 그것을 읽어야한다.이 책은 몇 가지 대안적인 접근법을 제시하고 각각의 장단점을 논의한다.

JPA를 사용하면이 문제에 접근하는 데 두 가지 방법이 있습니다. 첫 번째는보기에서 분리 된 엔티티 및 백엔드에서 확장 된 지속성 컨텍스트 (PC)로 작업하는 것입니다. 두 번째는 뷰가 활성 상태 인 동안 단일 트랜잭션을 활성 상태로 유지하는 것입니다. 우리가 여기서 두 번째 전략에 대해 이야기하고 있다고 가정합니다 -이 책에서 '트랜잭션 뷰'라고합니다.

중요한 점은 두 번째 시나리오는 원격 클라이언트에서 작동하지 않는다는 것입니다. 엔티티를 직렬화해야만 직렬화 된 (그리고 직렬화되지 않은) 표현이 어떤 식 으로든 PC에 연결되지 않습니다.

텍사스 스코프 PC를 사용하려면 같은 트랜잭션에서 쿼리와 렌더링이 이루어져야합니다. CMT를 사용하는 대신 UserTransaction을 사용해야합니다 (백엔드 빈에서 CMT를 계속 사용할 수 있음).

요점 :

public class MyServlet extends HttpServlet { 

    @Resource UserTransaction tx; 
    @EJB MyService bean; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    // ... 
    try { 
     tx.begin(); 

     List entities = bean.findAll(); 
     request.setAttribute("entities", entities); 
     getServletContext().getRequestDispatcher("/listEntities.jsp") 
     .forward(request, response); 

    } finally { 
     tx.commit(); 
    } 
    // ... 
    } 
} 

책은 JPS 페이지에 대한이 패턴을 사용하는 방법을 보여줍니다. 이 접근법을 JSF 나 Wicket과 같은 다른 프레임 워크에 매핑하는 방법을 잘 모르겠습니다.