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.