Ошибка «незаконный доступ к загрузке коллекции» - PullRequest
7 голосов
/ 22 октября 2011

Когда я выполняю свою программу без реализации 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 ]

7 голосов
/ 22 октября 2011

Ваш хэш-код и методы equals не работают должным образом.Убедитесь, что они правильные.toString() не имеет ничего общего с классами коллекции, но имеет хеш-код и equals.

Я предполагаю, что вы переопределили как хеш-код, так и равно, а не только хеш-код.

Object#hashCode() (Java Platform SE 7)

2 голосов
/ 22 октября 2011

Я думаю, что вы не должны использовать поле id (управляемое hibernate) в equals и / или hashCode.

Равные и hashCode должны быть реализованы как бизнес-логика равных.

0 голосов
/ 04 сентября 2013

У меня была та же ошибка, но с другим разрешением. Как и OP, я использую конструктор хеш-кода Apache. Моими объектами являются Родитель и Дитя, имеющие отношения один ко многим. Дочерний элемент включает Родителя в качестве члена, поэтому внешний ключ устанавливается правильно.

Проблема в том, что построитель хэш-кода использует все поля-члены, но когда создается дочерний элемент, его родительский объект еще не завершил загрузку. Когда конструктор хэш-кода ссылается на родительский элемент, Hibernate генерирует исключение, поскольку родительский элемент все еще загружается.

Исправление заключалось в том, чтобы исключить родительскую ссылку из компоновщика хеш-кода в hashCode класса Child и равняется:

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

@Override
public int hashCode()
{
    return HashCodeBuilder.reflectionHashCode(this, "parent" );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...