3

JPA实体图:例如

订单 - OrderItem - 产品

@NamedEntityGraph(name = "order", 
   attributeNodes = @NamedAttributeNode(value = "orderItems", subgraph = "orderItems"), 
   subgraphs = @NamedSubgraph(name = "orderItems", attributeNodes = @NamedAttributeNode("product")))

为什么没有 joinType order -> orderItems and orderItem -> product?实体图中的所有连接都应该是左连接?

4

2 回答 2

1

EntityGraph 的目的是定义要包含在结果图中的内容。

这不会影响连接类型。因此,您的依赖项的加载方式与在没有 EntityGraph 的情况下加载它们的方式相同。

于 2017-11-24T10:13:59.277 回答
0

在创建连接时,必须在 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急切地获取关系并将它们正确地重新安装到实体中。**

检查我的github链接: https ://github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/fetch/joinfetch/JPQLEntityGraphsJoinFetchTests.java

于 2019-01-22T15:57:06.037 回答