2013-07-17 6 views
0

프로그래밍의 년 후에 나 자신은 세션 범위 양식 및 지연로드 및 지연 커밋을 사용하는 경우 경우에 당신의 웹 애플리케이션에서 제대로 JPA를 사용하는 방법에 대한 지식이 부족 발견, 확인webapp에서 JPA를 사용하는 적절한 접근 방식은 무엇입니까?

업데이트. 다음과 같이

사건은 다음과 같습니다

  1. 웹 응용 프로그램 형태로 한 번 열어 세션 범위를 명시 적으로 닫히거나 세션이 파괴 될 때까지 유지 생성됩니다. 따라서 동일한 폼에 대한 여러 get 요청은 폼 자체를 렌더링하는 것 외에는 아무 일도하지 않습니다.
  2. 양식을 사용하면 동일한 루트 (예 : User, UserDocuments [] 및 UserSecurityGroup)의 Bean 또는 Bean 계층을 보거나 편집 할 수 있습니다. 마지막 두 개는 User에서 참조됩니다.
  3. 루트 개체의 폼에서 자식 개체를 열 수 있습니다. 하위 객체는 루트 객체와 동일한 트랜잭션에 저장됩니다 (em.persist(rootObject);Cascade.ALL을 사용).
  4. 후자가 닫힐 때까지 루트/하위 양식의 변경 사항을 취소 할 수 있습니다.
  5. 양식의 구성 요소는 지연로드를 사용하여 하위 개체를 참조 할 수 있습니다.
  6. 구성 요소는 사용자 정의 (구성 가능) 논리 (OnClick, OnChange, OnLoad 등)를 가지며 편집 된 bean의 최신 수정 버전을 참조 (읽기 또는 수정) 할 수 있습니다.

는 TomEE 사이트 http://tomee.apache.org/jpa-concepts.html의 간단한 설명에 따르면, 사람은 게으른 로딩이 영속 컨텍스트가 열릴 때, 한 사람이 모든 사람을 대신하여 게으른 로딩 물건을 어떻게해야에만 작동한다는 사실 주어진 웹 애플리케이션에서 JTA 지속성을 사용하기 때문에 수 없습니다 em.close() 전. 요청 범위가있는 EntityManager를 사용하면이 사실로 인해 포인트 3과 6을 구현할 수 없습니다. 세션 레벨에서 EntityManager를 움직여 해결할 수는 있지만, 그렇게한다면, 포인트 4를 만족할 수 없다 - 이미 만들어진 자식 객체에 대한 변경, 객체는 폼이 닫힌 후에도 관리된다. EntityManager를 폼 범위로 이동하면 응용 프로그램은 jdbc 리소스를 많이 사용하게됩니다 (또는 Does an entity manager create a connection to the database? 및 OpenJPA 설정은 http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/ref_guide_dbsetup_retain).

다른 대안에는 어떤 것이 있습니까?

답변

0

EclipseLink를 사용하는 경우 지속성 컨텍스트가 닫힌 후 LAZY 관계에 대한 액세스가 허용됩니다.

+0

하지만 커뮤니티에서 다른 아이디어를 만나서 다행 될 것입니다 그리고 기업의 영속 컨텍스트가 닫혀있는 동안 데이터를 수정하는 경우, 어떻게 변경 후 저장해야합니까? –

+0

구성 요소가 현재 편집 된 빈 (질문 본문에 추가됨)에 액세스하고 수정할 수있는 조건이 누락되었습니다. –

+0

트랜잭션 중에 만 변경할 수 있습니다. 분리 된 오브젝트를 변경하는 경우, 변경 사항을 적용하기 위해이를 새 지속성 컨텍스트로 병합해야합니다. – James

0

음, 다소이 문제를 해결했습니다. 포인트 3을 수정하여 테이블에 초안 항목을 저장할 수있는 경우이 문제는 더 이상 문제가 아니며 전체 솔루션을 훨씬 단순화합니다.

내가 :)

관련 문제