Hibernate3 父子映射报错:illegal access to loading collection


org.springframework.orm.hibernate3.HibernateSystemException: illegal access to loading collection; nested exception is org.hibernate.LazyInitializationException: illegal access to loading collection
Caused by: org.hibernate.LazyInitializationException: illegal access to loading collection
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:
341 )
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:
86 )
    at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:
355 )
    at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:
348 )
    at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:
309 )
    at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:
283 )
    at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:
150 )
    at com.hiany.forum.domain.base.BaseObject.hashCode(BaseObject.java:
32 )
    at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:
348 )
    at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:
309 )
    at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:
283 )
    at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:
150 )
    at com.hiany.forum.domain.base.BaseObject.hashCode(BaseObject.java:
32 )
    at java.util.HashMap.hash(HashMap.java:
264 )
    at java.util.HashMap.put(HashMap.java:
382 )
    at java.util.HashSet.add(HashSet.java:
194 )
    at java.util.AbstractCollection.addAll(AbstractCollection.java:
318 )
    at org.hibernate.collection.PersistentSet.endRead(PersistentSet.java:
273 )
    at org.hibernate.engine.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:
183 )
    at org.hibernate.engine.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:
268 )
    at org.hibernate.engine.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:
249 )
    at org.hibernate.loader.Loader.endCollectionLoad(Loader.java:
866 )
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:
853 )
    at org.hibernate.loader.Loader.doQuery(Loader.java:
717 )
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:
224 )
    at org.hibernate.loader.Loader.loadCollection(Loader.java:
1919 )
    at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:
36 )
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:
520 )
    at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:
60 )
    at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:
1676 )
    at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:
454 )
    at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:
755 )
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:
229 )
    at org.hibernate.loader.Loader.loadEntity(Loader.java:
1785 )
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:
47 )
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:
41 )
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:
2730 )
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:
365 )
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:
346 )
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:
123 )
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:
177 )
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:
87 )
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:
862 )
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:
799 )
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:
792 )
    at org.springframework.orm.hibernate3.HibernateTemplate$
1 .doInHibernate(HibernateTemplate.java: 460 )
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:
362 )
    at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:
454 )
    at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:
448 )
    at com.hiany.forum.dao.HibernateGenericDao.get(HibernateGenericDao.java:
41 )
    at com.hiany.forum.dao.HibernateEntityDao.get(HibernateEntityDao.java:
40 )
    at com.hiany.forum.dao.HibernateEntityDao$$FastClassByCGLIB$$967b2136.invoke(
< generated > )
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:
149 )
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:
714 )
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
162 )
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:
107 )
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
185 )
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:
652 )
    at com.hiany.forum.service.ArticleManager$$EnhancerByCGLIB$$64259eef.get(
< generated > )
    at com.hiany.forum.service.ArticleManageTest.testArticleManager(ArticleManageTest.java:
56 )
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39 )
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25 )
    at java.lang.reflect.Method.invoke(Method.java:
585 )
    at junit.framework.TestCase.runTest(TestCase.java:
154 )
    at junit.framework.TestCase.runBare(TestCase.java:
127 )
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:
69 )
    at junit.framework.TestResult$
1 .protect(TestResult.java: 106 )
    at junit.framework.TestResult.runProtected(TestResult.java:
124 )
    at junit.framework.TestResult.run(TestResult.java:
109 )
    at junit.framework.TestCase.run(TestCase.java:
118 )
    at junit.framework.TestSuite.runTest(TestSuite.java:
208 )
    at junit.framework.TestSuite.run(TestSuite.java:
203 )
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:
128 )
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:
38 )
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
460 )
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:
673 )
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:
386 )
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:
196 )
在做父子映射时候,使用父类去获取子类时候,报错如上。
跟踪栈信息,我们可以发现,domain object的 hashCode 方法有错误。
原来的domain object 使用了BaseObject作为基类:

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import java.io.Serializable;

/**
 * 基类,domain object 
 * 继承此类可以自动获得toString equals hashCode的method。
 
*/

public abstract class BaseObject implements Serializable {
    
private static final long serialVersionUID = 3256446889040622647L;

    
public String toString() {
        
return ToStringBuilder.reflectionToString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }


    
public boolean equals(Object o) {
        
return EqualsBuilder.reflectionEquals(this, o);
    }


    
public int hashCode() {
        
return HashCodeBuilder.reflectionHashCode(this);
    }

    
    
protected void init(){};
}

但是除去该基类后,发现错误被修复了。
暂时还不清楚问题为什么会发生。
posted on 2006-10-16 09:29 旱头憨脑 阅读(6166) 评论(1)  编辑  收藏

评论

# re: Hibernate3 父子映射报错:illegal access to loading collection 2007-12-19 14:44 d  回复  更多评论   

原因在与pojo里面的 public int hashCode() {... } 方法调用了set对象成员的hashCode()方法
如this.getSets().hashCode();
删除该方法的调用即可;调用非set对象成员的.hashCode()方法没有问题。

只有注册用户登录后才能发表评论。


网站导航: