Hibernate, fetch, HQL и hashCode () - PullRequest
       0

Hibernate, fetch, HQL и hashCode ()

1 голос
/ 12 марта 2012

У меня есть запрос HQL, что-то типа '

SELECT myclass 
FROM 
    MyClass myclass JOIN FETCH 
    myclass.anotherset sub JOIN FETCH 
    sub.yetanotherset
...

Итак, класс MyClass имеет свойство "anotherset", которое представляет собой набор, содержащий экземпляр другого класса, давайте назовем его MyClassTwo.И у класса MyClassTwo есть свойство Yetanotherset, которое представляет собой набор классов третьего типа (без дальнейших ассоциаций с ним).

В этом сценарии у меня возникают проблемы с реализацией hashCode.По сути, реализация hashCode в MyClassTwo использует свойство «thananotherset», и в точном соответствии со свойством все же доступное свойство завершается с ошибкой LazyInitializationException.

org.hibernate.LazyInitializationException: illegal access to loading collection 

Я полагаю, это потому, что данные из "Yetanotherset" еще не были получены, но как я могу это исправить?Мне не особенно нравится идея использовать хеш-код, чтобы игнорировать свойство.

Дополнительный вопрос, игнорирует ли HQL fetch = FetchType.EAGER, как определено в XML или аннотациях, похоже, что так и есть.Но я нигде не могу это проверить.

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Реализация hashCode() с использованием изменяемого поля - плохая идея: это делает невозможным сохранение сущности в HashSet и изменение изменяемого свойства.

Реализация его в виде набора других сущностей является еще более худшей идеей: она заставляет загрузку коллекции вычислять hashCode.

Выберите уникальное неизменяемое свойство (или набор свойств) в вашей сущности и на его основе реализуйте hashCode. В крайнем случае, у вас есть возможность использовать идентификатор, но если он генерируется автоматически, вы не должны помещать его в набор перед созданием идентификатора.

1 голос
/ 13 марта 2012

Это самое известное исключение hibernate, и именно так, как вы его описали.Сеанс был отключен, транзакция закрыта, и вы пытаетесь получить доступ к этой коллекции.JOIN FETCH в вашем HQL должен заставить загрузку EAGER происходить независимо от того, присутствует ли аннотация.

Я подозреваю, что ваши аннотации искажены, у вас отсутствуют или устарели файлы jar, или есть какие-то другие проблемы этого типа.и точно выяснить, какой SQL выполняется до того места, где вы видите это исключение.Это должно указать вам, работает ли ваша конфигурация гибернации так, как вы думаете.

Опубликуйте больше своего кода и журналов, и кто-то может помочь вам обнаружить ошибку.

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