JPA / Hibernate загрузить всю цепочку в автоматическом relashionship

Я использую JPA Entity Graphs для активной загрузки отношений.

Но моя проблема заключается в следующем:

Отношение - это авто-отношение, подобное этому:

public class X{

     ...

     @OneToOne
     @JoinColumn(name = "foreign_key")
     protected @Getter @Setter X parent;

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
     private @Getter @Setter Set<X> children;
}

Поэтому, когда я получаю объект X из базы данных, дети тоже загружаются. Это правильно. Но когда я получаю первый объект потомков Set и получаю их потомков, hibernate выполняет другой запрос в базе данных.

Мой класс сущности аннотирован с этим:

@NamedEntityGraph(
        name = "cobranca-com-lancamentos-com-filhos",
        attributeNodes = {
            @NamedAttributeNode(value = "children")
        }
    )

и мой поиск такой:

em.createQuery("FROM X WHERE id = " + id).setHint("javax.persistence.fetchgraph", em.getEntityGraph("cobranca-com-lancamentos-com-filhos")).getSingleResult();

Любая идея?

1 ответ

Вы говорите, что хотите охотно загружать детей. Но в коде вы явно задаете FetchType.LAZY - так вы хотите загружать с нетерпением или ленивым?

Поскольку вы используете Hibernate, вы получите прокси для детей. При первом использовании набора (это с size() или что-то еще) дети загружаются ленивыми, как вы определили с FetchType.LAZY,

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