2017-01-19 4 views
0

Как заставить конкретный запрос к ленивой загрузке атрибута, который обычно имеет загруженную загрузку? EntityGraphType.FETCH не работает.Принудительная загрузка обычно желающих атрибутов

@NamedEntityGraph(name="negGraphName",attributeNodes={ 
     @NamedAttributeNode("name"), 
     @NamedAttributeNode("grup")}) 
class User{ 
    private String name; 

    @ManyToOne 
    private UserGroup grup; 

    @ManyToMany(fetch=FetchType.EAGER) 
    protected Set<Authority> authoritiesList; 
} 

interface UserRepository extends CrudRepository<String, User>{ 
    @EntityGraph(value="negGraphName", type=EntityGraphType.FETCH) 
    @Query("<custom query here>") 
    private Collection<User> getUsersInSpecialQuery(@Param("paramName") String paramName); 
} 

в основном, когда я называю userRepository.getUsersInSpecialQuery() первоначальный запрос присоединяется к объекту, а не присоединиться к власти, однако затем Hibernate в любом случае инициализирует список власти с ОТДЕЛЬНЫМ SQL QUERY PER USER РЕЗУЛЬТАТА, который является крайне неэффективным. Кроме того, он инициализирует родительский граф объекта ObjectObject, который даже не помечен как Eager.

Отключить fetch=FetchType.EAGER on authorityList отключил дополнительные запросы для каждого пользователя, но я все еще хочу, чтобы он с нетерпением ждал всех других запросов.

EntityGraphType.Fetch «s Javadoc говорит:

Когда свойство javax.persistence.fetchgraph используется для указания сущности графа, атрибуты, которые задаются с помощью атрибутов узлов объекта графа рассматриваются как FetchType. EAGER и атрибуты, которые не указано, рассматриваются как FetchType.LAZY

однако ясно, что это не так для меня


Hibernate : Force lazy-loadding on eager field < - не есть решение

Fetch Type LAZY still causes Eager loading Hibernate Spring data < - утверждает, что проблема заключается в том, что ленивый атрибут был загружен при просмотре, но в моем случае, я прошел через в спящем режиме, и это было при материализации объекта пользователя

ответ

1

Вы не можете сделать EAGER ОБЪЕДИНЕНИЕ ЛАЗИ. Я предлагаю вам сделать это LAZY и во всех запросах, где вы хотите EAGERLY JOIN FETCH authoritiesList, чтобы они были эффективными EAGER.

Другим вариантом является subentity который в основном такой же, как текущего объекта пользователя, отображаются в одной и той же таблицы БД, но без отношений вы не хотите:

@Entity 
@Table(name="SAME_TABLE_AS_USER_ENTITY") 
class BasicUser{ 
    private String name; 

    @ManyToOne 
    private UserGroup grup; 

} 

Другой вариант наследования.

+0

насчет 'EntityGraphType.Fetch'. разве это не означает, что он будет просто загружать упомянутые атрибуты, а остальные будут ленивы? –

0

Я думаю, что, наконец, понимаю. Весенние данные EntityGraphTypes относятся к различным вещам. Это перечисление просто ярлык для следующего JPA запроса подсказки

  • javax.persistence.fetchgraph относится к тому, как строится запрос,
  • javax.persistance.loadgraph относится к тому, как объекты заполняются из результирующего набора ,

так что нет никакого ответа, что в прошлом @Robert_Niestroj рекомендовал

Смежные вопросы