Hibernate: Частичная ленивая инициализация? - PullRequest
3 голосов
/ 05 марта 2011

У меня есть связь «многие ко многим», определенная как:

Parent.hbm.xml:

    <set name="children" table="child_parent_map" lazy="true">
        <cache usage="nonstrict-read-write" />
        <key column="parent_id" />
        <many-to-many class="Child">
            <column name="child_id" not-null="true" index="child_parent_by_child"/>
        </many-to-many>
    </set>

Child.hbm.xml:

    <set name="parents" table="child_parent_map" lazy="true">
        <cache usage="nonstrict-read-write" />
        <key column="child_id" />
        <many-to-many column="parent_id" class="Parent"  lazy="false"/>
    </set>

Я вполне уверен, что инициализирую Parent.children, прогуливаясь по коллекции.Примерно так:

for(Child child : parent.getChildren()) {
    Hibernate.initialize(child.getAnotherProperty());
}

Родитель имеет шестерых детей.Тем не менее, в одном сеансе родитель, кажется, имеет только пять, а в другом (через 2 секунды ничего не изменилось в БД или в другом сеансе) - все шесть.На самом деле, я обнаружил это после отделения этих сущностей от сеанса с пользовательским клонером.

Я думал, что ленивые коллекции либо полностью инициализированы (т.е. все элементы), либо нет.Возможно ли, что каким-то образом только часть коллекции была инициализирована?Может ли быть проблема с кэшированием?

EDIT : этот сеанс обрабатывает довольно большой набор данных (несколько тысяч объектов).Возможно ли это потому, что некоторые уже загруженные объекты были исключены из сеанса?

1 Ответ

1 голос
/ 17 марта 2011

Начните с проверки методов hashCode () и equals () , неправильная реализация этих методов часто приводит к такому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...