Sobes.tech
Назад к вопросам
Junior — Middle
69

Каким образом можно реализовать иерархические связи между сущностями в JPA, используя Entity Graph?

Компании, где спрашивали
AstonAston

Ответ от нейросети

sobes.tech AI

В JPA Entity Graph используется для определения, какие связанные сущности должны быть загружены вместе с основной сущностью, что помогает оптимизировать запросы и избежать проблемы N+1.

Для реализации иерархических связей с помощью Entity Graph можно:

  • Создать NamedEntityGraph с указанием атрибутов, включая вложенные связи через subgraphs.
  • В subgraph указываются связи второго уровня и далее, формируя иерархию.

Пример:

@Entity
@NamedEntityGraph(
    name = "Order.detail",
    attributeNodes = @NamedAttributeNode(value = "items", subgraph = "itemsSubgraph"),
    subgraphs = @NamedSubgraph(
        name = "itemsSubgraph",
        attributeNodes = @NamedAttributeNode("product")
    )
)
public class Order {
    @OneToMany(mappedBy = "order")
    private List<Item> items;
}

@Entity
public class Item {
    @ManyToOne
    private Product product;
}

При выполнении запроса можно указать этот граф:

EntityGraph<?> graph = em.getEntityGraph("Order.detail");
Map<String, Object> props = new HashMap<>();
props.put("javax.persistence.fetchgraph", graph);
Order order = em.find(Order.class, orderId, props);

Таким образом, загружаются Order, его items и связанные с ними product, формируя иерархическую загрузку.