Граф сущности JPA: какие типы соединений?
Граф сущности JPA: например
Order - OrderItem - Продукт
@NamedEntityGraph(name = "order",
attributeNodes = @NamedAttributeNode(value = "orderItems", subgraph = "orderItems"),
subgraphs = @NamedSubgraph(name = "orderItems", attributeNodes = @NamedAttributeNode("product")))
Почему нет joinType для order -> orderItems and orderItem -> product
? Все объединения в графе сущностей должны быть левыми соединениями?
1 ответ
Цель EntityGraph - определить, что включить в график результатов.
Это не влияет на тип соединения. Таким образом, ваши зависимости загружаются так же, как и без EntityGraph.
Типы соединений должны быть указаны в запросах JPQL или критериях запросов при создании объединений.
Например, приведенный ниже запрос приведет к внутреннему объединению трех таблиц.
select o from Order o join fetch o.orderItems items join fetch items.product p
И запрос ниже приведет к левому внешнему соединению между тремя таблицами:
select o from Order o left join o.orderItems items left join items.product p
Но если вы будете выполнять вышеуказанные запросы напрямую, Hibernate вернет перекрестное объединение всех трех таблиц.
** Следовательно, чтобы получить ретро-подогнанные (все отношения правильно инициализированы) сущности, вам нужно будет передать граф сущностей как подсказку для запроса. График сущности не изменит тип соединения, который вы указали в запросе или запросе Criteria. Он просто укажет на спящий режим, чтобы охотно извлекать отношения, и корректно вписывать их в сущности. **
Проверьте мою ссылку на github: https://github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/fetch/joinfetch/JPQLEntityGraphsJoinFetchTests.java