Граф сущности 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

Другие вопросы по тегам