2011-11-07 6 views
1

게으른 로딩에 대한 몇 가지 테스트를 시도하면서 잘 이해하고 있는지 확인하기 위해 완전히 혼란스러워했다. 게으른 로딩에 대해 혼동을 느낀다.

@Entity 
public class Family { 
@Id 
private int id; 


@OneToMany(mappedBy="family", fetch=FetchType.LAZY) 
private Set<Person> members; 

//getters & setters 

public String toString(){ 
    String s=""; 
    for(Person p:getMembers()){ 
     s+=p.getFirstName(); 
    } 
    return s; 
} 
} 

@Entity 
public class Person implements Comparable<Person>{ 
@Id 
private int id; 

private String firstName; 
private String lastName; 

@ManyToOne 
private Family family; 

//getters &setters 
} 

여기 내 주요 방법입니다 :

여기에 내가 내 테스트에 사용하고 엔티티의 내가 게으른 로딩 이해 무엇

public static void main(String[] args) { 
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
    em = factory.createEntityManager(); 

    Query q = em.createQuery("select f from Family f"); 
    List<Family> families= q.getResultList(); 

    em.clear(); 
    em.close(); 
    factory.close(); 

    for(Family f:families){ 
     System.out.println(f); 
    } 
} 

이있는 속성에 표시되어있는 경우 그 느리게 가져오고 관리하는 동안 액세스하지 않으면 메모리에로드되지 않고 나중에 액세스하려고 시도 할 수 없습니다. 이제는 EM과 EMF를 닫은 후에도 분리 된 패밀리 목록을 통해 지연 멤버 속성에 액세스 할 때 위에서 설명한 테스트에 아무런 문제가 없다는 점이 혼란 스럽습니다! 그게 정상인가요? 나 - 게으른 로딩 컨셉을 이해하지 못해?

참고 : DB가 내장 된 J2SE 환경을 사용하고 있습니다. 내 제공자는 사전에 EclipseLink가

감사

입니다
조지

답변

2

엔티티가 로깅되는 경우와 같이 팩토리가 닫히기 전에 toString 메소드가 트리거되지 않는지 확인하십시오. 이 오류가 발생하기 쉽고 예기치 않게 트리거 될 수 있으므로 toString 메서드에서 트리거링 관계를 사용하지 않는 것이 좋습니다. EclipseLink 로깅을 켜면 문제의 일부가 아닌 것으로 가정하여 팩토리의 라이프 사이클에서 액세스 할 수있는 위치를 알 수 있습니다.

+0

도움을 주신 것에 대해 이미 감사드립니다. [여기] (http : //www.eclipse.org/forums/index.php/mv/msg/261691/755570/#msg_755570) :-) –

0

JPA에 공급자가 초기화 지연을 사용하는 데 필요하지 않기 때문에 그것은있을 수 있습니다. JPA 제공 업체의 경우 필수 항목은 아니지만 a hint입니다.

FetchType.EAGER이 지정되면 JPA가 데이터를 열심히 가져와야하지만 FetchType.LAZY이 지정되면 데이터를 지연 가져올 필요가 없습니다.

+0

답변 해 주셔서 감사합니다. 내 JPA 공급자가 지연 링크 AFAIK를 지원하는 EclipseLink라는 것을 잊어 버렸습니다. –

2

eclipselink 에이전트를 사용하고 있거나 정적 제직을 사용하고 있는지 확인하십시오. 둘 다 사용하지 않으면 LAZY는 weaved되지 않으며 EAGER를 갖게됩니다.

또한 EclipseLink는 EntityManager가 닫힌 후 LAZY 관계에 대한 액세스를 지원합니다. 공장 출하 후가 아니라. 그러나 개체가 캐시에 있으면 닫힌 후에도 작동 할 수 있습니다. 또한 동일한 지속성 단위에서 다른 팩토리가 열린 경우 지속성 단위는 여전히 열려 있습니다.

+0

[여기] (http://www.eclipse.org/forums/index.php/mv/tree/160098/#page_top)에서 비슷한 질문을 발견했습니다. James라고하는 멤버도 :-)) "실제로 직조하는 것은 단지 OneToMany에서 게으른 OneToOne/ManyToOne Lazy가 게으름을 피우는 데만 필요합니다."라고 말하면서, [here] (http://wiki.eclipse.org)에서 확인되었습니다./Using_EclipseLink_JPA_Extensions_ % 28ELUG % 29 # What_You_May_Need_to_Know_About_EclipseLink_JPA_Lazy_Loading). –

+0

EntityManegr이 닫힌 후에 LAZY 관계에 대한 액세스 지원에 관해서는, i concider this advantage 때문에 다소 문제가 없습니다 ...난 그냥 게으른 관계에 액세스하지 않는 경우 메모리에로드되지 않습니다, 그리고 appearently이 일이 일어나지 않을 수도 있기 때문에 공장 (내가 내 예제에서 그것을 시도했을 때 독특한)을 닫은 후에도, 패밀리 인스턴스는 여전히 회원에게 액세스 할 수 있으며 위에서 설명한대로 공장을 폐쇄하기 전에는 아무 것도 액세스하지 않았습니다. ( –

관련 문제