Pascal4eg / Java

 Java | Фишки и трюки

JPA Entity Graph

@NamedEntityGraph(
        name = "person-with-address",
        attributeNodes = {
                @NamedAttributeNode("name"),
                @NamedAttributeNode(value = "address", subgraph = "address-subgraph")
        },
        subgraphs = {
                @NamedSubgraph(name = "address-subgraph", attributeNodes = {
                        @NamedAttributeNode("city")
                })
        }
)
@Entity
public class Person {
    private String name;
    @ManyToOne
    private Address address;
}

@Entity
public class Address {
    private String city;
}
...

EntityGraph<Person> entityGraph = entityManager.getEntityGraph("person-with-address");
Map<String, Object> properties = new HashMap<>();
properties.put("jakarta.persistence.fetchgraph", entityGraph);
Person person = entityManager.find(Person.class, 1L, properties);

JPA Entity Graph - это механизм, предоставляемый JPA, который позволяет явно указывать, какие атрибуты сущности должны быть загружены или проигнорированы во время выполнения запросов к базе данных. Это может быть полезно для управления жадной загрузкой (eager loading) и ленивой загрузкой (lazy loading) связанных сущностей.

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

В нашем примере мы создали именованный граф сущности (person-with-address), который включает атрибуты name из сущности Person и также включает атрибут address с дополнительным подграфом (address-subgraph), который включает атрибут city из сущности Address.

Далее мы используем getEntityGraph для получения ссылки на ранее созданный граф сущности, а затем передаем его в запрос find с использованием соответствующих свойств. Это позволяет загрузить только указанные атрибуты, что может быть полезно для оптимизации производительности и избежания избыточной загрузки данных.

Entity Graph можно так же создавать динамически используя метод createEntityGraph вместо getEntityGraph.