Коллекции загружаются, даже если они объявлены как Lazy - PullRequest
1 голос
/ 26 мая 2011
@Entity 
public class User {

    @ManyToMany(cascade = { MERGE, PERSIST, CascadeType.REFRESH }, fetch = LAZY)
    @Cache(usage = READ_WRITE)
    @UserRoles
    private List<Role> roles = new ArrayList<Role>(0);

}

Коллекции загружаются, даже когда они объявлены как Lazy, что может быть причиной того, что они загружаются, даже если они объявлены как Lazy

1 Ответ

2 голосов
/ 26 мая 2011

Согласно спецификации 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Но я вполне уверен, что это требование относится и к нему.Попробуйте и посмотрите, если это причина, и дайте нам знать.

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