Hibernate 5: EntityGraph не работает с соединениямиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Hibernate 5: EntityGraph не работает с соединениями

Сообщение Anonymous »

У меня возникли проблемы с использованием EntityGraph для переопределения отложенной загрузки некоторых атрибутов.
В следующих примерах Person.picture помечен с помощью @ManyToOne(fetch = FetchType) .LAZY).
Если я просто загружаю объекты одного типа без каких-либо объединений, все работает отлично.

Код: Выделить всё

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root root = criteriaQuery.from(Person.class);
criteriaQuery.select(root);

TypedQuery typedQuery = this.entityManager.createQuery(query);
EntityGraph entityGraph = entityManager.createEntityGraph(Person.class);
entityGraph.addAttributeNodes("picture");
query.setHint("javax.persistence.loadgraph", entityGraph);

List result = typedQuery.getResultList();
Я не вижу прокси для Person.picture, но всегда вижу реальный объект Picture. Я также вижу в сгенерированном SQL, что для таблицы Picture создается JOIN.
Но когда я делаю несколько объединений, EntityGraph принимается а также проверено, но по каким-то причинам не применено:

Код: Выделить всё

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root root = criteriaQuery.from(DepartmentMember.class);
Join person = root.join("member", JoinType.INNER);
Join department = root.join("department", JoinType.INNER);
criteriaQuery.where(criteriaBuilder.equals(department.get("name"), "development"));
criteriaQuery.select(person);

TypedQuery typedQuery = this.entityManager.createQuery(query);
EntityGraph entityGraph = entityManager.createEntityGraph(Person.class);
entityGraph.addAttributeNodes("picture");
query.setHint("javax.persistence.loadgraph", entityGraph);

List result = typedQuery.getResultList();
Я получаю объекты Person, у которых всегда установлен прокси для Person.picture. В сгенерированном SQL-запросе я вижу только определенные мной соединения JOIN, но не дополнительные. EntityGraph определенно проверен, потому что если я добавлю некоторые несуществующие атрибуты, все это выдаст ошибку.
Я попробовал другой подход, используя соединения fetch - и это работает . Нравится:

Код: Выделить всё

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root root = criteriaQuery.from(DepartmentMember.class);
Join person = root.join("member", JoinType.INNER);
person.fetch("picture");
Join department = root.join("department", JoinType.INNER);
criteriaQuery.where(criteriaBuilder.equals(department.get("name"), "development"));
criteriaQuery.select(person);

TypedQuery typedQuery = this.entityManager.createQuery(query);

List result = typedQuery.getResultList();
Здесь я вижу JOIN в сгенерированном SQL, а Person.picture имеет не прокси, а реальный объект.
Кто-нибудь знает, в чем может быть причина того, что EntityGraph не работает при использовании объединений? Что-то не так в моем подходе к EntityGraph?

Подробнее здесь: https://stackoverflow.com/questions/791 ... with-joins
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»