2011-10-22 49 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"); 
}