[求教]为什么我在使用HashCodeBuilder在one-to-many关系中出现Lazy异常最近遇到一个奇怪的问题,我在实体类
[求教]为什么我在使用HashCodeBuilder在one-to-many关系中出现Lazy异常
最近遇到一个奇怪的问题,我在实体类的基类中使用了org.apache.commons.lang.builder.HashCodeBuilder,然后在one-to-many关系映射(customer <---> order)中出现org.hibernate.LazyInitializationException: illegal access to loading collection异常。
小弟刚刚接触hibernate,这个问题找了两天才发现问题所在,但是仍然不知道为什么会这样,请大家不吝赐教。
环境:struts + hibernate3, hibernate2也试验过
异常:
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:411)
at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:392)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:353)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:327)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:194)
at cz.model.BaseObject.hashCode(BaseObject.java:78)
at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:392)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:353)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:327)
at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:194)
at cz.model.BaseObject.hashCode(BaseObject.java:78)
at java.util.HashMap.hash(HashMap.java:261)...
Hibernate 3 和 2 都是这个异常
只是2的异常描述是:net.sf.hibernate.LazyInitializationException: cannot access loading collection
程序片断:
BO基类 cz.model.BaseObject
abstract public class BaseObject implements Serializable {public BaseObject(){} ... 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); }cz.model.Customer继承BaseObject public class Customer extends BaseObject implements Serializable { ...}cz.model.Order继承BaseObject public class Order extends BaseObject implements Serializable { ...}映射文件Customer.hbm.xml<?xml version="1.0" encoding='UTF-8'?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" ><hibernate-mapping> <class name="cz.model.Customer" table="CUSTOMERS"> <id name="id" column="ID" type="long"> <generator inverse="true" lazy="true"> <key column="CUSTOMER_ID" /> <one-to-many name="code"><hibernate-mapping><class name="cz.model.Order" table="ORDERS"><id name="id" type="long" column="ID"><generator /></id> ....<many-to-one name="customer" column="CUSTOMER_ID"cascade="save-update"/></class></hibernate-mapping>
DAO实现类中的方法public Customer getCustomerById(Long customerId) throws AppException {Session session = HibernateUtil.getSession();Transaction tx = null;try {tx = session.beginTransaction();Query query = session.createQuery("from Customer c where c.id=:id");query.setLong("id", customerId.longValue());Customer customer = (Customer)query.uniqueResult();Set orderset = customer.getOrders(); //在这里会抛出上面说的异常,如果在BaseObject.java中去掉 //public int hashCode() 方法就会正常,这是为什么呢??System.out.println("orderset size=" + orderset.size());tx.commit();return customer;} catch (Exception ex) {HibernateUtil.rollbackTransaction(tx);AppException.appError(ex).printStackTrace();throw AppException.appError(ex);} finally {HibernateUtil.closeSession(session);}}请大家帮我解答一下这个问题,谢谢。
1 楼 surroad 2007-02-07 遇到类似的问题,请教高手 2 楼 yes100 2007-02-16 我也遇到了,这个问题 3 楼 jasongreen 2007-03-14 可以自己实现HashCodeBuilder<br/>
<br/>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'>?</div>
<ol class='dp-j' start='1'>
<li class='alt'><span><span class='keyword'>import</span><span>?java.lang.reflect.Array;??</span></span></li>
<li class=''><span>??</span></li>
<li class='alt'><span><span class='keyword'>public</span><span>?</span><span class='keyword'>class</span><span>?HashCodeBuilder?{??</span></span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?HashCodeBuilder()?{??</span></span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>private</span><span>?</span><span class='keyword'>int</span><span>?result?=?</span><span class='number'>17</span><span>;??</span></span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>boolean</span><span>?field)?{??</span></span></li>
<li class='alt'><span>????????result?=?<span class='number'>37</span><span>?*?result?+?(field???</span><span class='number'>1</span><span>?:?</span><span class='number'>0</span><span>);??</span></span></li>
<li class=''><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class='alt'><span>????}??</span></li>
<li class=''><span>??</span></li>
<li class='alt'><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>byte</span><span>?field)?{??</span></span></li>
<li class=''><span>????????result?=?<span class='number'>37</span><span>?*?result?+?(</span><span class='keyword'>int</span><span>)?field;??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>char</span><span>?field)?{??</span></span></li>
<li class='alt'><span>????????result?=?<span class='number'>37</span><span>?*?result?+?(</span><span class='keyword'>int</span><span>)?field;??</span></span></li>
<li class=''><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class='alt'><span>????}??</span></li>
<li class=''><span>??</span></li>
<li class='alt'><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>short</span><span>?field)?{??</span></span></li>
<li class=''><span>????????result?=?<span class='number'>37</span><span>?*?result?+?(</span><span class='keyword'>int</span><span>)?field;??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>int</span><span>?field)?{??</span></span></li>
<li class='alt'><span>????????result?=?<span class='number'>37</span><span>?*?result?+?field;??</span></span></li>
<li class=''><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class='alt'><span>????}??</span></li>
<li class=''><span>??</span></li>
<li class='alt'><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>long</span><span>?field)?{??</span></span></li>
<li class=''><span>????????result?=?<span class='number'>37</span><span>?*?result?+?(</span><span class='keyword'>int</span><span>)?(field?^?(field?>>>?</span><span class='number'>32</span><span>));??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>float</span><span>?field)?{??</span></span></li>
<li class='alt'><span>????????result?=?<span class='number'>37</span><span>?*?result?+?Float.floatToIntBits(field);??</span></span></li>
<li class=''><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class='alt'><span>????}??</span></li>
<li class=''><span>??</span></li>
<li class='alt'><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(</span><span class='keyword'>double</span><span>?field)?{??</span></span></li>
<li class=''><span>????????append(Double.doubleToLongBits(field));??</span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?HashCodeBuilder?append(Object?field)?{??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>if</span><span>(field?==?</span><span class='keyword'>null</span><span>)??</span></span></li>
<li class=''><span>????????????result?=?<span class='number'>0</span><span>;??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>else</span><span>?</span><span class='keyword'>if</span><span>?(field.getClass().isArray())?{??</span></span></li>
<li class=''><span>????????????<span class='keyword'>for</span><span>?(</span><span class='keyword'>int</span><span>?i?=?Array.getLength(field)?-?</span><span class='number'>1</span><span>;?i?>=?</span><span class='number'>0</span><span>;?i--)?{??</span></span></li>
<li class='alt'><span>????????????????append(Array.get(field,?i));??</span></li>
<li class=''><span>????????????}??</span></li>
<li class='alt'><span>????????}?<span class='keyword'>else</span><span>??</span></span></li>
<li class=''><span>????????????append(field.hashCode());??</span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?</span><span class='keyword'>this</span><span>;??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?</span><span class='keyword'>int</span><span>?toHashCode()?{??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?result;??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??????</span></li>
<li class=''><span>????<span class='annotation'>@Override</span><span>??</span></span></li>
<li class='alt'><span>????<span class='keyword'>public</span><span>?</span><span class='keyword'>int</span><span>?hashCode()?{??</span></span></li>
<li class=''><span>????????<span class='keyword'>return</span><span>?result;??</span></span></li>
<li class='alt'><span>????}??</span></li>
<li class=''><span>??????</span></li>
<li class='alt'><span>????<span class='annotation'>@Override</span><span>??</span></span></li>
<li class=''><span>????<span class='keyword'>public</span><span>?String?toString()?{??</span></span></li>
<li class='alt'><span>????????<span class='keyword'>return</span><span>?String.valueOf(result);??</span></span></li>
<li class=''><span>????}??</span></li>
<li class='alt'><span>??</span></li>
<li class=''><span>}??</span></li>
</ol>
</div>