最近在使用Hibernate 3.x做一個小項目,但是在持久化一些類的時候拋出以下異常
Sep 2, 2010 12:56:40 PM org.hibernate.LazyInitializationException <init><br />SEVERE: illegal access to loading collection<br />org.hibernate.LazyInitializationException: illegal access to loading collection<br />at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)<br />at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)<br />at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:434)<br />at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:881)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:174)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:348)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:387)<br />at com.platform.gui.framework.model.BaseBean.hashCode(BaseBean.java:26)<br />at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:881)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:174)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:348)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:387)<br />at com.platform.gui.framework.model.BaseBean.hashCode(BaseBean.java:26)<br />at java.util.HashMap.put(HashMap.java:418)<br />at java.util.HashSet.add(HashSet.java:194)<br />at java.util.AbstractCollection.addAll(AbstractCollection.java:318)<br />at org.hibernate.collection.PersistentSet.endRead(PersistentSet.java:352)<br />at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:260)<br />at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:245)<br />at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:218)<br />at org.hibernate.loader.Loader.endCollectionLoad(Loader.java:921)<br />at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:909)<br />at org.hibernate.loader.Loader.doQuery(Loader.java:773)<br />at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)<br />at org.hibernate.loader.Loader.loadCollection(Loader.java:2082)<br />at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62)<br />at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:628)<br />at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)<br />at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1853)<br />at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:479)<br />at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:899)<br />at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:275)<br />at org.hibernate.loader.Loader.doList(Loader.java:2449)<br />at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)<br />at org.hibernate.loader.Loader.list(Loader.java:2187)<br />at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)<br />at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)<br />at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)<br />at TestDB.testRes(TestDB.java:103)<br />at TestDB.main(TestDB.java:22)<br />Exception in thread "main" org.hibernate.LazyInitializationException: illegal access to loading collection<br />at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)<br />at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)<br />at org.hibernate.collection.PersistentSet.hashCode(PersistentSet.java:434)<br />at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:881)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:174)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:348)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:387)<br />at com.platform.gui.framework.model.BaseBean.hashCode(BaseBean.java:26)<br />at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:881)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:174)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:348)<br />at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:387)<br />at com.platform.gui.framework.model.BaseBean.hashCode(BaseBean.java:26)<br />at java.util.HashMap.put(HashMap.java:418)<br />at java.util.HashSet.add(HashSet.java:194)<br />at java.util.AbstractCollection.addAll(AbstractCollection.java:318)<br />at org.hibernate.collection.PersistentSet.endRead(PersistentSet.java:352)<br />at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:260)<br />at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:245)<br />at org.hibernate.engine.loading.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:218)<br />at org.hibernate.loader.Loader.endCollectionLoad(Loader.java:921)<br />at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:909)<br />at org.hibernate.loader.Loader.doQuery(Loader.java:773)<br />at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)<br />at org.hibernate.loader.Loader.loadCollection(Loader.java:2082)<br />at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:62)<br />at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:628)<br />at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:83)<br />at org.hibernate.impl.SessionImpl.initializeCollection(SessionImpl.java:1853)<br />at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:479)<br />at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:899)<br />at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:275)<br />at org.hibernate.loader.Loader.doList(Loader.java:2449)<br />at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)<br />at org.hibernate.loader.Loader.list(Loader.java:2187)<br />at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)<br />at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)<br />at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)<br />at TestDB.testRes(TestDB.java:103)<br />at TestDB.main(TestDB.java:22)
後來發現是自己的domain類繼承了一個BaseBean,而那個BaseBean使用了apache commons-lang包裡的一些類,比如:ToStringBuilder, EqualsBuilder和HashCodeBuilder,代碼大致如下:
<br />import java.io.Serializable;<br />import org.apache.commons.lang.builder.EqualsBuilder;<br />import org.apache.commons.lang.builder.HashCodeBuilder;<br />import org.apache.commons.lang.builder.ToStringBuilder;<br />import org.apache.commons.lang.builder.ToStringStyle;<br />public abstract class BaseBean implements Serializable {<br />private static final long serialVersionUID = 1L;<br />@Override<br />public String toString() {<br />return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);<br />}</p><p>@Override<br />public boolean equals(Object obj) {<br />return EqualsBuilder.reflectionEquals(this, obj);<br />}</p><p>@Override<br />public int hashCode() {<br />return HashCodeBuilder.reflectionHashCode(this);<br />}<br />}
而以上異常就是由於其中的
@Override<br />public int hashCode() {<br />return HashCodeBuilder.reflectionHashCode(this);<br />}
引起的,解決辦法就是不要繼承父類的hashCode方法,或者自己寫個hashCode方法。