JPA / Hibernate - subclassSubgraphs в NamedEntityGraph игнорируются

Я использую JPA 2.1 и Hibernate 5.3.3. У меня есть следующие объекты с NamedEntityGraph, определенным для GeoObject.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@NamedEntityGraph(
    name = "graph.GeoObject",
    attributeNodes = { @NamedAttributeNode(value = "histogram")},
    subclassSubgraphs = {
    @NamedSubgraph(name = "subgraph.A", type = A.class, attributeNodes = { @NamedAttributeNode(value = "pictures") }),
    @NamedSubgraph(name = "subgraph.B", type = B.class, attributeNodes = { @NamedAttributeNode(value = "artifacts") })
    }
)
public abstract class GeoObject extends ObjectBase {

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "id", updatable = false, insertable = false)
    private Set<HistogramEntry> histogram = new HashSet<>();

    ...
}

@Entity
public class A extends GeoObject {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinTable(joinColumns=@JoinColumn(name = "a_id"), inverseJoinColumns=@JoinColumn(name = "image_id"))
    private Set<Image> pictures = new HashSet<>();

    ...
}

@Entity
public class B extends GeoObject {

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @JoinColumn(name = "b_id", updatable = false)
    private Set<Artifact> artifacts = new HashSet<>();

    ...
}

Чтобы получить список всех геообъектов, я делаю следующий запрос:

final EntityManager em = getEntityManager();
final CriteriaQuery<GeoObject> query = em.getCriteriaBuilder().createQuery(GeoObject.class);
final Root<GeoObject> entityRoot = query.from(GeoObject.class);
final EntityGraph<?> objGraph = em.getEntityGraph("graph.GeoObject");

final String hint = "javax.persistence.fetchgraph";
final List<GeoObject> result = new ArrayList<>(em.createQuery(query.distinct(true)).setHint(hint, objGraph).getResultList());

Все объекты GeoObject загружаются в один запрос SQL, как и ожидалось (включая атрибут гистограммы). Но для набора изображений из A, а также для набора артефактов из B для каждого объекта генерируются индивидуальные запросы. Нет ли способа создать EntityGraph, который приводит к единому запросу для всех объектов?

Кстати, когда я пытаюсь определить EntityGraph динамически, вот так:

final EntityGraph<GeoObject> objGraph = em.createEntityGraph(GeoObject.class);
objGraph.addAttributeNodes("histogram");
objGraph.addSubclassSubgraph(A.class).addAttributeNodes("pictures");
objGraph.addSubclassSubgraph(B.class).addAttributeNodes("lines");

Я получаю NotYetImplementedException в addSubclassSubgraph.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 071
1

Ответы 1

Я думаю, это связано с проблемой открытого спящего режима, https://hibernate.atlassian.net/browse/HHH-10378

Другие вопросы по теме