2012-04-12 2 views
4

JPA 작업을 시작하려고합니다. 다른 테이블에 외래 키가있는 테이블이 있습니다. JPA 엔티티를 생성 할 때 해당 변수에 대해 여러 개의 주석을 얻습니다. 결과 세트에서 모든 테이블을 다시 가져 오려면 어떻게해야합니까? 내가 정말로 그것을 부르면. 다음은 내가하려는 일의 예입니다.Lazy vs Eager with JPA

@OneToMany(mappedBy="resourceId") 
private List<DistributionLink> distributionLinkCollection; 

@OneToMany 주석은

나는 다시 내가 바로이 테이블을 요구 명명 된 쿼리를 호출 할 필요가있는 모든 값을 얻기 위해 생각하고 ... 꽤 앉아있다?

qLaunchArr = (QuickLaunch[])emf.createNamedQuery("QuickLaunch.getQuickLaunch").getResultList().toArray(); 

나는 모든 결과 세트가 포함 된 DistributionLinks 배열을 얻게 될 것이라고 생각합니다. 이제는 이것이 Eager Loading 대 Lazy 로딩과 관련이 있다는 것을 알고 있습니다. 정확히 무엇인지 모르겠습니다. 나는 게으른 로딩이 오직 @oneToMany 애트리뷰트를 명시 적으로 불러 온다는 것을 안다 (나는 생각한다)? 내가 필요로하는 컬렉션을 모두 되돌릴 수있는 방법. 결과 집합을 반복하고 명명 된 쿼리를 호출하여 명명 된 쿼리를 사용하여 모든 결과 집합을 가져와야합니까?

감사합니다.

답변

6

트랜잭션 컨텍스트에 있는지 여부에 따라 게으른로드를 선택하면 getter로 하위 컬렉션을 가져올 때 JPA가 자동으로 가져옵니다. 따라서 데이터가 부모 객체를 가져온 엔티티 관리자가있는 세션 빈을 떠난다면 자동으로로드 된 콜렉션을 인스턴스화 할 수 없습니다.

EAGER 가져 오기 전략을 사용하면 해당 컬렉션의 각 인스턴스가 미리 인스턴스화되어 어디서나 사용할 수 있습니다.

설계 결정을 제한하지 않아도되지만 (해당 레코드를 가져올 때마다 필요하지 않은 물건을로드하지 않으려면 지연로드를 사용할 수 있음) 좋은 대안으로 이러한 컬렉션 만 처리 할 수 ​​있습니다. 부모 엔티티를 가져 오는 bean은 미리 콜렉션이 필요하다는 것을 알 때 질의에 충실해야합니다.

JOIN FETCH distributionLinks 
+0

5 월 가능이 질문에 도움을 줄 수 있습니다. http : // stackoverflow. com/questions/9624725/no-session-or-session-was-closed-with-jpa-2-and-ejb-3-1 – pWoz

관련 문제