2012-02-14 2 views
3

Hibernate/JPA 세계에서 입력을받는 dataTables를 다루는 올바른 방법이 무엇인지 궁금합니다. 내가 말할 수있는 한, 다음 세 가지 선택 중 하나가 카드 전체가 붕괴되는 원인이되고 있지만 어느 것이 잘못되었는지는 알 수 없습니다. 시작과에서 데이터를 가져 오는 요청 범위의 관리 빈을 사용하여 데이터 테이블 ice/ace : dataTable을 JPA와 요청 범위 콩으로 통합하기

  • 내부 편집 구성 요소를 넣는 모든 요청
  • 대해 트랜잭션을 커밋 사용자 정의 JSF PhaseListener를 통해 처리

    • 반자동 트랜잭션 (transaction)의 EntityManager 요청 범위의 EntityManager (URL에서 요청 범위 Bean에 ID를 설정하기위한 PrettyFaces 도움말)
    • 뷰 범위 또는 세션 범위 bean 대신 요청 범위 bean으로 dataTable을 백업하는 중입니다.

    나는 an ICEfaces dataTable demo using JPA을 볼 수 있지만 트랜잭션을 수동으로 관리하고 편집 구성 요소를 기본적으로 표시하지 않습니다. 객체를 편집 가능성을 위해 지명 한 행을 클릭하면 "저장"을 클릭하면 저장을 수동으로 트리거하기 전에 수동으로 새 EntityManager에 객체를 다시 연결합니다. 나는 click-to-edit 함수가 올바른 객체가 현재 세션에 재 부착되도록하는 방법을 알려주고 있고, 비슷한 것이 없으면 어떻게 살아갈 지 모르겠다.

    새로운 ICEfaces 3.0에 대한 인상 : dataTable (née PrimeFaces 2.0 dataTable)은 View 또는 Session 범위 Bean에서 사용하기위한 것이지만 어떻게 보이지는 않습니다. 요구 A와 EntityManager A에서 DAO로부터 나오는 모델 객체가 있고 EntityManager B로 요청 B에 의해 수정되거나 페이징되는 경우 StaleObjectState 및/또는 LazyInitializationExceptions를 처리 할 수 ​​있습니다.

    Java EE 어떤 종류의 심오한 fu를 통해,하지만 나는 Tomcat 6에서 지금은 더 멋진 곳으로 업그레이드 할 수있는 사치품을 가지고 있지 않습니다 (장기적으로는 내 의도 임에도 불구하고). 우리는 Spring이나 Seam 또는 다른 멋진 것들이 무엇이든 사용하지 않을 것입니다. ICEfaces는 우리에게 이상한 요소입니다. 솔직히 너무 이상합니다.

    요약하면 다음 중 어느 것이 잘못된 선택입니까? 요청 범위가있는 엔티티 관리자, 요청 범위가있는 dataTable 또는 dataTable 내부의 편집 구성 요소를 사용하고 있습니까? 아니면 정말로 여기 뭔가 잘못입니까?

  • 답변

    4

    당신이 나에게 묻는다면, 당신의 요구 사항이 좀 더 애호가를 위해 비명을 지르는 것처럼 보일 때, 거의 맨손 인 Tomcat에 붙어있는 것처럼 보인다. 만트라는 일반적으로 Tomcat을 "다른 모든 것"이 필요하지 않을 때 사용하므로 필요할 때 Tomcat을 계속 사용하는 이유는 무엇입니까?

    그건 그렇고, 그 패턴은 정말로 그리 어렵지 않습니다.또는 뷰 매개 변수

  • 사용 사용하는 별도의 서비스 클래스와 함께 PreRenderViewEvent 방법 (더 ID를 같은 매개 변수가없는 경우) -
    • 은보기가 @PostConstruct에서 초기 데이터를 취득 콩에게
    • 을 백업의 범주가 지정된 되세요 엔티티 관리자는
    • 엔티티 관리자 EJB없이
      • "거래 범위"확인 획득하고 데이터를 저장/CDI는/봄 :
        • 모든 작업에 대해 엔티티 관리자 팩토리에서 새 엔티티 관리자를 얻습니다.
        • (자원 로컬) 트랜잭션을 시작하고, 작업을 수행하고, 트랜잭션을 커밋하고, 엔티티 관리자를 닫습니다.
    • 반환 귀하의 백업 콩에서 직접 개체의 목록, 엔티티의 해당 속성 테이블의 편집 모드 입력 필드를 바인딩합니다.
    • 단일 행을 업데이트하는 경우 해당 엔티티를 서비스의 업데이트 메소드에 전달하십시오. 엔티티 관리자를 얻는 오버 헤드 외에도 트랜잭션 시작 등은 기본적으로 엔티티 관리자에서 merge() 만 호출합니다.

    항상 detached entities으로 작업하는 서비스 외부에서 실현됩니다. 따라서 LazyInitializationExceptions에 대한 위험이 없습니다. Backing Bean은 뷰 범위에 있어야 JSF에 의해 올바른 (분리 된) 엔티티가 업데이트되고, 사용자 코드는이를 서비스에 전달하여이를 지속성 컨텍스트에 병합합니다.

    계속 발생의 흐름

    따라서이다 :

     
    View state    View scope  Transaction scoped PC 
    Facelet/components  Backing Bean  Service 
         Strings ------> Detached entities --> Attached entities 
    

    이 방법은 조금 지루 서비스 및하지만 매저 키스트 운동의 종류를 만들기

    (데이터를 얻기위한 흐름이 정확하게 반대입니다). 위의 예제 앱과 두 가지 메소드 (get과 update)는 그렇게 나쁘지는 않을 것입니다. 그러나 어떤 큰 앱이라면 빨리 사라질 것입니다.

    이미 Tomcat에 JSF와 JPA를 추가하고 있다면 TomEE과 같은 것을 사용하십시오. 이것은 Tomcat (25MB 대 7MB)보다 간신히 크며 당신이 피하려고하지만 실제로는 필요로하는 모든 것을 담고 있습니다.

    Tomcat 설치를 절대 업그레이드 할 수없는 경우 (예 : 제품 소유자 또는 관리자가 개발자 대신 서버를 소유하고 있다고 생각하는 경우) CDI에 대해 배우는 데 투자하고 싶을 수 있습니다. 이것은 전쟁에 쉽게 추가 할 수 있으며 (단 하나의 추가 병), 많은 지루한 코드를 추상화 해 봅시다. 여러분이 실제로 사용할 수있는 한 가지는 JTA 제공자입니다. 이것 역시 당신의 전쟁과는 별도로 추가 할 수 있지만, TomEE (또는 GlassFish, Resin, JBoss 등과 같은 대안)를 사용하면 더 잘 추가 할 수 있습니다. 상세한 답변 Communication in JSF 2.0

  • +0

    감사 :

    또한 다양한 요구 사항의 일부를 커버이 문서를 참조하십시오. 내 druthers가 있다면 우리는 글래스 피쉬로 업그레이 드 것입니다; 나는 몇몇 애플 리케이션을 성공적으로로드 할 수있게되었지만 TomEE 하에서 실제로 실행될만한 것을 얻지 못했다.나는 상황에 대한 당신의 분석에 완전히 동의한다, 나는 단지 내가 지금 원하는 것을하기 위해 조직을 강요하는 사치가 없다. 그래도 나는 당신의 충고를 적용하고 앞으로 나아갈 길을 찾을 수있을 것이라고 생각합니다. 다시 한 번 감사드립니다! –

    +1

    @DanielLyons TomEE에 대한 우리의 유익 (저는 TomEE에서 일하고 있습니다)에 대해 devee (at) openejb.apache.org에서 TomEE가 직면 한 문제에 대해 자세히 설명해 줄 수 있습니까? 우리는 젊은 서버이며 우리가 얻을 수있는 모든 피드백이 정말로 필요합니다. –

    +0

    이번 주말에 자세한 내용을 알려 드리겠습니다. 나는 그것이 베타 버전이라는 이유로 어려움을 겪었다고 생각했다. –