2011-09-21 56 views
2

我有一个导致一些悲伤的org.hibernate.envers.entities.mapper.relation.lazy.proxy.ListProxy实例:每当我以编程方式尝试访问它时,我得到一个空指针异常(即调用list.size()),但是当我第一次检查使用Eclipse的变量检查器的对象我看到Hibernate生成一条SQL语句并且列表动态地改变。然后一切正常。我怎样才能以编程方式做同样的事情?我试过list.toString()但这似乎没有帮助。eclipse在检查变量时做什么(调试时)

更新1

不知道如果这有助于但是当我第一次点击列表实例我在显示屏看到:

com.sun.jdi.InvocationException occurred invoking method. 

然后数据库查询运行,当我再次点击我得到正确的.toString()结果。

更新2

原来这里是例外,我得到(当我不检查调试模式下的元素)。

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有你seing Hibernate的延迟加载在深行动:)

基本上冬眠负荷代理类为您提供了懒惰的关联关系,例如,您可以为您的C类获得一个Hibernate自动生成代理的List(实际上是一个PersistenceBag实现),而不是C类列表。这是hibernate延迟加载关联值的方式,直到它们实际被访问。所以这就是为什么当你在eclipse调试器(基本上通过自省访问实例的字段/方法)访问它时,你会看到sql hibernate触发器获取所需的数据。

这里的诀窍是,根据何时访问懒惰集合,您可能会得到不同的结果。如果你使用eclipse调试器来访问它,你更有可能仍然在开始加载这个东西的Hibernate会话中,所以一切都按预期工作,当访问这个东西并且加载数据时,一个sql被(懒惰地)触发。问题是,如果你想在你的代码中访问相同的数据,但是在会话已经关闭的时候,你会得到一个LazyInitializationException或null(后者如果你使用某个库来清理put hibenrate proxises作为Gilead)

+0

失败的代码(抛出异常)是正确的,我有我的断点设置,所以显然会话仍然有效吗?不同之处在于,如果我跨越下一行,它会爆炸,但是如果我使用Eclipse进行检查,那么可以跨越下一行。 –

+1

我认为当eclipse调试器访问文件时也会出现这个错误,这就是它只是由Eclipse继承而来。当你不使用eclipse进行调试/切换时,你得到的确切错误是什么? –

+0

好点,没有想到......我会附加例外原始问题。 –

相关问题