2013-04-30 3 views
0

지연로드를 사용하지 않으면 거의 모든 데이터베이스가로드 될 것입니다. 또한 모델에서 직접 직렬화를 사용하므로 때로는 프록시를 초기화해야합니다.JPA Hibernate 콜렉션이 지연로드되지 않음

컬렉션에만 지연로드를 사용하고 싶습니다. 일부 단수의 엔티티가 열심히 가져온 사실은 잘 작동합니다. 그러나 컬렉션을 설치하려고해도 프록시 컬렉션을 얻지 못해도 항상로드 된 컬렉션을 얻습니다.

몇 가지 예제 코드입니다 :

@Entity 
public class Thread implements Externalizable { 
    @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY) 
    public List<Reply> getReplies() { 
     return replies; 
    } 

그래서 여기에 문제는 디버거를 확인할 때, 응답의 persistantBag 목록은 항상 정보로 가득 실제 회신 빈 프록시 대신 객체입니다된다는 것입니다 나는 그것을 원한다.

thread를 원할 때 entityManager.find (Thread.class, "ID")를 사용하면 Fetch = FetchType.LAZY인지 여부와 상관없이 항상 이러한 모든 컬렉션이로드됩니다.

내가 이해하는 한, fetchtype lazy를 설정하면 원하는대로 작동해야합니다. 또한 엔터티를 thread.getReplies()를 사용할 때로드하여 직렬화하여 클라이언트에 보낼 수 있기를 바랍니다. getReplies가 지연된 (lazy)로드가 전혀 없으므로 프록시가있는 엔티티에서 작동하는지 여부는 알 수 없습니다.

나는 Intellij를 사용하지 않고 그것을 사용하여 최대 절전 모드로 JPA를 설정합니다. 나는 또한 컬렉션이 완전히 비어 있기를 원하는 유사한 질문을했지만 가능하다면 나는이 질문을 대신 요구하고있다.

JPA Hibernate want lazy load to return empty collection

은 아직 유래에이 겉으로는 기본적인 질문에 좋은 답변을 보지 못했다. JPA/Hibernate를 처음 접했을 때부터 질문이 실제로 교육적 방법으로 답변을 받았을 경우에만 링크로 회신 해주십시오.

미리 감사드립니다.

답변

2

지연 수집에 프록시가 포함되어 있지 않습니다. 컬렉션 자체는 느슨하게로드 된 컬렉션입니다. 즉, 데이터베이스에서 스레드를 가져올 때 응답 목록이 초기화되지 않습니다.

getReplies()을 호출하면이 초기화되지 않은 목록이 반환됩니다. 목록 자체 (예 : size() 또는 iterator())에서 메소드를 호출 할 때만 최대 절전 모드가 스레드의 모든 응답 상태를로드하는 SQL 쿼리를 실행하여 목록을 초기화합니다.

디버거를 사용하여 컬렉션에 포함 된 내용을 확인하는 것은 좋지 않습니다. 일반적으로 디버거는 등 뒤에서 목록의 메서드를 호출하므로 목록 자체가 초기화됩니다. Hibernate.isInitialized(thread.getReplies()) 메서드를 사용하여 컬렉션이 초기화되었는지 확인할 수 있습니다.

다른 질문에 대해서는 최대 절전 모드가 데이터베이스 행을 개체에 매핑하는 데 사용됩니다. 쓰레드가 응답을 가지고 있다면, Hibernate는 결코 당신에게 빈리스트를 리턴함으로써 아무 것도 가지고 있지 않다는 것을 알려주지 않을 것이다. 그것은 심각한 버그가 될 것입니다. 응답을로드하지 않으려면 응답 목록에서 아무 메소드도 호출하지 마십시오.

+0

고마워요! 그리고 답을 수락하는 것을 잊어 버려서 죄송합니다.) 디버거가 실제로 내 뒤에서 내 혼란을 일으키는 메서드를 호출하는 것을 놓쳤습니다. –