Согласно спецификации JPA 2.0, отложенная выборка является подсказкой для поставщика сохраняемости.
В разделе 11.1.6 говорится:
Стратегия EAGER является требованием к поставщику сохраняемостиво время выполнения эти данные должны быть загружены с нетерпением.Стратегия LAZY - это подсказка среде выполнения персистентного поставщика о том, что данные должны извлекаться лениво при первом обращении к ним. Реализация позволяет быстро получать данные, для которых указана подсказка стратегии LAZY.
В некоторых случаях поставщик может определить, что нет смысла лениво извлекать что-либо, или, возможно, провайдер может даже не реализовать отложенную выборку.
Методы PersistenceUtil.isLoaded можно использовать для определения состояния загрузкисущность и ее атрибуты независимо от единицы сохранения, с которой связана сущность.
Чтобы быть уверенным, что вы столкнулись с такой проблемой, вам следует использовать этот метод.Конечно, если сущность отсоединилась, может помочь и простая проверка лениво извлеченного поля.
Кроме этого, я не вижу конкретной причины, основываясь на опубликованном коде того, почему ваши коллекции не являютсябыть ленивымЯ думаю, что, возможно, тот факт, что вы используете кэш 2-го уровня, может повлиять в этом случае, но это то, что я не проверял, это просто догадка.
[EDIT-1]
Существует также проблема с отложенной загрузкой, если вы используете последние классы.В документации Hibernate сказано: постоянные классы :
Центральная особенность прокси-серверов Hibernate зависит от того, является ли постоянный класс не окончательным, или от реализации интерфейса, который объявляетвсе открытые методы.
Вы можете сохранить финальные классы, которые не реализуют интерфейс с Hibernate.Однако вы не сможете использовать прокси-серверы для отложенной выборки ассоциаций, что в конечном итоге ограничит ваши параметры настройки производительности.
Следует также избегать объявления открытых финальных методов в не финальных классах.Если вы хотите использовать класс с открытым финальным методом, вы должны явно отключить прокси, установив lazy = "false".
[EDIT-2]
Кроме того, в спецификации JPA 2.0 в разделе 2.1 указано, что сущности не должны быть окончательными:
Класс сущности не должен быть окончательным.Никакие методы или постоянные переменные экземпляра класса сущностей не могут быть окончательными
Это же требование позже указано для встраиваемых объектов в разделе 2.5.
У меня нет доступа к спецификации JPA 1.0Но я вполне уверен, что это требование относится и к нему.Попробуйте и посмотрите, если это причина, и дайте нам знать.