2016-11-28 12 views
0

Я использую JPA Entity Graphs, чтобы с нетерпением загружать отношения.jpa/hibernate загрузить с нетерпением всю цепочку в auto relashionship

Но моя проблема:

Отношения является авто-отношения, как это:

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(); 

Любой идея?

ответ

0

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

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

+0

Я хочу загрузить с нетерпением только в этом конкретном запросе. Из-за этого я использую JPA Named Entity Graph. Когда я использую дочерние объекты X объекта, спящий режим не проконсультируется с базой данных, как я уже сказал, это строго, я хочу это. Но когда я получаю элемент children Set и перебираю их детей Set, hibernate обращается к базе данных, и это то, чего я не хочу, понимаю? –