获取“非法访问加载集合”错误

时间:2011-10-22 13:59:32

标签: java hibernate

当我执行我的程序而没有实现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>

任何人都可以解释错误吗?

3 个答案:

答案 0 :(得分:7)

您的hashcode和equals方法无法正常工作。确保它们是正确的。 toString()与集合类无关,但hashcode和equals无关。

我假设你已经覆盖了hashcode和equals,而不仅仅是hashcode。

Object#hashCode() (Java Platform SE 7 )

答案 1 :(得分:2)

我认为你不应该在equals和/或hashCode中使用id字段(由hibernate管理)。

Equals和hashCode应该实现为业务逻辑等于。

答案 2 :(得分:0)

我有同样的错误,但分辨率不同。就像OP我正在使用Apache的哈希码构建器。我的对象是具有一对多关系的父母和孩子。子项包含Parent作为成员,以便正确设置外键。

问题是,哈希码构建器使用了所有成员字段,但是在创建Child时,其Parent还没有完成加载。当哈希码构建器引用父成员时,Hibernate会抛出异常,因为Parent仍在加载。

修复是从Child的hashCode中的hashcode构建器中排除父引用,并且等于:

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

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