只了解了作用,具体用法其实还没怎么去看懂,但摘抄在这里先MARK一下
作用描述:
有时数据库表中可能存在一对一,一对多这样的映射,加载某个实体需加载很多个关联的其他实体(即N+1问题),而EntityGraph则是比较好的解决该问题的方法。
摘抄一段比较更详细的作用描述:(from:使用EntityGraph解决JPA下N+1问题)
Now I have Entity A, B and C, their relationship is like:
A--oneToMany-->B--oneToMany-->C
Default is LAZY fetching B and C. However this is so fucking painful because when I tried to load a page(500 items) of A immediately with all the nested information, it will take several seconds wasted on LAZY loading all the nested entities B and C with thousands of queries asking database for B of each A and C of each B.
To solve this N+1 problem with JPA without implementing your own DAO level, we can make use of EntityGraph.
用法:(from使用Entity Graph优化JPA查询 | TONY'S TOY BLOG (tony-bro.com))
实体图概念
Entity Graph简单翻译为实体图,不过感觉加载图这个称呼可能更加符合一些。官方文档中Entity Graph可以解释为针对特定持久化查询或操作的模板,常常用于创建实体的抓取策略。简单来说Entity Graph可以指定如何获取实体以及实体关联的实体,就好比一张图一般。
实体图应用
创建实体图可以使用代码或者注解,一般来说使用注解,代码的方式不直观而且不方便。
|
可以看到注解的形式是注解在实体类上的,一个实体图由一个@NamedEntityGraph
注解表示,使用@NamedAttribute
来指定要加载的字段,如果加载的字段还需要加载子字段,那么可以使用@NamedSubgraph
添加子图并且使用subgraph这个属性进行指定,子图中的节点可以指定另外的子图作为subgraph值,这样通过@NamedAttributeNode
和@NamedSubgraph
就可以完整地描述一幅实体图。
根据官方文档的描述,实体图可以有两种应用方式,分别是提取图(fetch graph)和负载图(load graph)。Fetch Graph将会急加载指定的字段,其余字段将忽略原来的加载类型;Load Graph将会急加载指定的字段,其余字段按原来默认的属性加载(详情连接)。
应用实体图时,可以直接在Repository接口方法上进行注解,如果图比较简单,也可以直接在注解上写明属性路径,这样就不需要编写实体图。在使用EntityManager直接进行查询时可以将Entity Graph作为QueryHint进行输入。
|