2011-10-22 52 views
6

當我執行我的程序時未執行hashcode()toString(),那麼它工作正常。但只要我包括hashcode()toString()然後我得到這個「非法訪問加載收集」錯誤。獲取「非法訪問加載收集」錯誤

我的HBM文件是

1)booking.hbm.xml

<many-to-one name="userId" class="User" column="user_id" 
     insert="true" update="true" cascade="save-update" > 
    </many-to-one> 
    <many-to-one name="flightId" class="FlightSchedule" 
     column="flight_id" cascade="all" not-null="true"> 
    </many-to-one> 

    <set name="passenger" table="passenger79215" lazy="false" 
     inverse="true" cascade="save-update"> 
     <key column="reference_id" /> 
     <one-to-many class="Passenger" /> 
    </set> 

2)Passenger.hbm.xml

<many-to-one name="referenceid" class="Booking" lazy="false" 
     insert="true" update="true" column="reference_id " 
     cascade="save-update"> 
    </many-to-one> 

3)User.hbm .xml

<set name="booking" table="bookings79215" lazy="true" 
     inverse="false" cascade="save-update"> 
     <key column="user_id" /> 
     <one-to-many class="Booking" /> 
    </set> 

任何人都可以解釋錯誤嗎?

回答

6

您的hashcode和equals方法無法正常工作。確保它們是正確的。 toString()與集合類無關,但散列碼和equals相同。

我假設你已經重寫hashcode和equals,而不僅僅是哈希碼。

Object#hashCode() (Java Platform SE 7)

+0

你好拉維...我Overrided這樣 HashCodeBuilder.reflectionHashCode(本); EqualsBuilder.reflectionEquals(this,obj); ToStringBuilder.reflectionToString(this); –

+0

您正在依靠第三方工具來生成您的哈希碼,該哈希碼可能無法根據您的成員變量生成不同的哈希碼。如果您有一個字段爲兩個不同的對象保存相同的值,則可能會得到錯誤的哈希碼。 嘗試自己生成哈希碼(或者如果你碰巧使用Eclipse,在你的類內右鍵單擊 - >源 - >生成哈希碼並等於) –

+0

hello ravi ...我也生成Hashcode()和equals()提供,它仍然給出相同的錯誤... –

2

我覺得你不應該使用在平等和/或在的hashCode id字段(由Hibernate管理)。

Equals和hashCode應該作爲一個業務邏輯equals來實現。

0

我有同樣的錯誤,但具有不同的分辨率。像OP一樣,我使用Apache的哈希碼生成器。我的對象是具有一對多關係的父對象和子對象。孩子包括父母作爲成員,以便外鍵得到適當設置。

問題是,哈希碼生成器使用所有成員字段,但是在創建子時,其父尚未完成加載。當哈希碼生成器引用父成員時,Hibernate會拋出異常,因爲父仍在加載。

此修復程序是排除的哈希碼生成器在孩子的的hashCode父參考,並等於:

@Override 
public boolean equals(final Object obj) 
{ 
    return EqualsBuilder.reflectionEquals(this, obj, "parent"); 
} 

@Override 
public int hashCode() 
{ 
    return HashCodeBuilder.reflectionHashCode(this, "parent"); 
}