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
,