2011-09-21 4 views
2

나는 슬픔을 일으키는 org.hibernate.envers.entities.mapper.relation.lazy.proxy.ListProxy의 인스턴스를 가지고 있습니다 : 프로그래밍 방식으로 액세스하려고 할 때마다 널 포인터 예외 (즉, list.size() 호출)가 발생하지만 처음 검사 할 때 Eclipse의 변수 속성을 사용하는 객체 나는 Hibernate가 SQL 문을 생성하고 목록이 동적으로 변경되는 것을 본다. 모든 것이 작동합니다. 프로그래밍 방식으로 동일한 작업을 수행하려면 어떻게해야합니까? 내가 시도했습니다 list.toString()하지만 도움이되지 않는 것.이클립스는 디버깅하는 동안 변수를 검사 할 때 무엇을합니까

업데이트 1

이 도움이된다면

이 몰라 그러나 나는 처음에는 화면에 표시되는 목록 인스턴스를 클릭하면 :

다음
com.sun.jdi.InvocationException occurred invoking method. 

데이터베이스 쿼리가 실행되고 다시 클릭하면 나는 정확한 .toString() 결과를 얻는다.

업데이트 여기에 2

내가 얻을 원의 예외 (I 디버그 모드에서 요소를 검사하지 않는 경우)입니다. (임시 해킹 사실 이상)

java.lang.NullPointerException 
    at org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:72) 
    at org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:104) 
    at org.hibernate.envers.entities.mapper.relation.OneToOneNotOwningMapper.mapToEntityFromMap(OneToOneNotOwningMapper.java:74) 
    at org.hibernate.envers.entities.mapper.MultiPropertyMapper.mapToEntityFromMap(MultiPropertyMapper.java:118) 
    at org.hibernate.envers.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:93) 
    at org.hibernate.envers.entities.mapper.relation.component.MiddleRelatedComponentMapper.mapToObjectFromFullMap(MiddleRelatedComponentMapper.java:44) 
    at org.hibernate.envers.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:67) 
    at org.hibernate.envers.entities.mapper.relation.lazy.initializor.ListCollectionInitializor.addToCollection(ListCollectionInitializor.java:39) 
    at org.hibernate.envers.entities.mapper.relation.lazy.initializor.AbstractCollectionInitializor.initialize(AbstractCollectionInitializor.java:67) 
    at org.hibernate.envers.entities.mapper.relation.lazy.proxy.CollectionProxy.checkInit(CollectionProxy.java:50) 
    at org.hibernate.envers.entities.mapper.relation.lazy.proxy.CollectionProxy.size(CollectionProxy.java:55) 
    at <MY CODE HERE, which checks list.size()> 

최종 솔루션

boolean worked = false; 
while (!worked) { 
    try { 
     if(list.size() == 1) { 
      // do stuff 
     } 
     worked = true; 
    } catch (Exception e) { 
     // TODO: exception must be accessed or the loop will be infinite 
     e.getStackTrace(); 
    } 
} 

답변

4

그럼 어떻게이 happends는 기본적으로 부하를 최대 절전 모드 깊은 행동 :)에

를 Hibernate의 지연로드를 seing하고있다 프록시 클래스를 사용하면 Lazy와 관련된 릴레이션이 생겨 클래스 C의리스트 대신 C 클래스의 Hibernate 자동 생성 프록시의 List (실제로는 PersistenceBag 구현)를 얻을 수있다. 이는 절전 모드가 실제로 액세스 될 때까지 해당 연결 값의로드를 지연시키는 방식입니다. 따라서 Eclipse 디버거 (기본적으로 인트로 스펙 션을 통해 인스턴스의 필드/메쏘드에 액세스하는)에서 디버거에 액세스하면 SQL hibernate 트리거가 필요한 데이터를 가져 오는 것을 볼 수 있습니다.

여기에있는 속임수는 게으른 모음에 액세스 할 때마다 다른 결과가 나타날 수 있습니다. 이클립스 디버거를 사용하여 액세스하는 경우, 그 일을로드하기 시작한 Hibernate 세션에서 여전히 가능성이 높습니다. 따라서 모든 것이 예상대로 작동하기 때문에, 물건이 액세스되고 데이터가로드 될 때 SQL이 (느슨하게) 트리거됩니다. 문제는 코드에서 동일한 데이터에 액세스하려고하지만 세션이 이미 닫힌 지점에서 LazyInitializationException 또는 null을 얻는 것입니다 (후자는 hibenrate proxises를 클리닝하기 위해 라이브러리를 사용하는 경우입니다. Gilead)

+0

내 중단 점 세트가있는 곳에서 오류가 발생 (예외가 발생 함) 한 코드가 올바르게 표시되므로 세션이 여전히 유효합니다. 차이점은 내가 다음 줄로 넘어가 버리면 그것은 날려 버린다.하지만 이클립스로 검사하면 다음 줄로 넘어 가서 작동한다. –

+1

나는 이클립스 디버거가 fileds에 액세스 할 때 오류가 발생한다고 생각한다. 계속 진행되는 이클립스에 의해 단순히 채워진다는 것이다. eclipse로 디버깅/스텝 오버를하지 않을 때 정확한 오류는 무엇입니까? –

+0

좋은 점, 그 생각하지 않았다 ... 나는 원래의 질문에 예외를 첨부합니다. –

관련 문제