这是我关于JPA 2.1实体图的第二篇文章。 第一篇文章描述了命名实体图的用法。 这些可用于定义在编译时将使用查找或查询方法获取的实体和/或属性的图形。 动态实体图以相同的方式但以动态方式这样做。 这意味着您可以在运行时使用EntityGraph API定义实体图。

如果您错过了第一篇文章,并且想阅读如何定义命名实体图或JPA 2.0如何解决延迟加载问题,请查看以下文章: JPA 2.1实体图–第1部分:命名实体图 。

示例实体

我们将使用与上一篇文章相同的示例。 因此,如果您已阅读另一段,则可以跳过此段。

我们将使用3个实体。 它们是OrderOrderItemProduct 。 一个Order可能包含多个OrderItem ,每个OrderItem都属于一个Product 。 所有这些关系的FetchType都是FetchType.LAZY。 因此,默认情况下,实体管理器不会从数据库中获取它们,而是使用代理对其进行初始化。

订单实体:

@Entity
@Table(name = "purchaseOrder")
@NamedEntityGraph(name = "graph.Order.items", attributeNodes = @NamedAttributeNode(value = "items", subgraph = "items"), subgraphs = @NamedSubgraph(name = "items", attributeNodes = @NamedAttributeNode("product")))
public class Order implements Serializable {@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", updatable = false, nullable = false)private Long id = null;@Version@Column(name = "version")private int version = 0;@Columnprivate String orderNumber;@OneToMany(mappedBy = "order", fetch = FetchType.LAZY)private Set<OrderItem> items = new HashSet<OrderItem>();...

OrderItem实体:

@Entity
public class OrderItem implements Serializable
{@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", updatable = false, nullable = false)private Long id = null;@Version@Column(name = "version")private int version = 0;@Columnprivate int quantity;@ManyToOneprivate Order order;@ManyToOne(fetch = FetchType.LAZY)private Product product;

产品实体:

@Entity
public class Product implements Serializable
{@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "id", updatable = false, nullable = false)private Long id = null;@Version@Column(name = "version")private int version = 0;@Columnprivate String name;

动态实体图

因此,让我们定义一个动态实体图。 我们将与第一篇文章中的操作相同,并定义一个简单的实体图,该图告诉实体管理器获取带有所有相关OrderItemOrder 。 因此,我们使用实体管理器的createEntityGraph(Class rootType)方法为Order实体创建实体图。 在下一步中,我们创建将与该实体图一起获取的Order实体的所有属性的列表。 我们只需要添加属性items ,因为我们将使用该实体图作为加载图,并且默认情况下所有其他属性都渴望使用。

如果我们将此实体图用作提取图,则需要将所有属性添加到应从数据库中提取的列表中。

EntityGraph<Order> graph = this.em.createEntityGraph(Order.class);
graph.addAttributeNodes("items");Map<String, Object> hints = new HashMap<String, Object>();
hints.put("javax.persistence.loadgraph", graph);this.em.find(Order.class, orderId, hints);

好的,动态定义应从数据库中获取实体的哪些属性很不错。 但是,如果我们需要实体图呢? 像使用其所有OrderItems及其产品获取订单

这可以通过子图来完成。 子图基本上是一个嵌入到另一个实体图或实体子图中的实体图。 子图的定义类似于实体图的定义。 为了创建并嵌入子图到实体图,我们需要调用addSubgraph(字符串的attributeName)方法EntityGraph对象上。 这将为具有给定名称的属性创建一个子图。 在下一步中,我们需要定义此子图应获取的属性列表。

以下代码段显示了带有实体子图的实体图的定义,该图指示实体管理器获取带有OrderItem及其ProductOrder

EntityGraph<Order> graph = this.em.createEntityGraph(Order.class);
Subgraph<OrderItem> itemGraph = graph.addSubgraph("items");
itemGraph.addAttributeNodes("product");Map<String, Object> hints = new HashMap<String, Object>();
hints.put("javax.persistence.loadgraph", graph);return this.em.find(Order.class, orderId, hints);

里面发生什么事了?

与上一篇文章一样,我们希望查看休眠日志,并找出休眠状态。 如我们所见,动态实体图的结果与命名实体图的结果相同。 它创建一个负载计划和一个包含所有3个实体的一条select语句。

2014-04-07 20:08:15,260 DEBUG [org.hibernate.loader.plan.build.spi.LoadPlanTreePrinter] (default task-2) LoadPlan(entity=blog.thoughts.on.java.jpa21.entity.graph.model.Order)- Returns- EntityReturnImpl(entity=blog.thoughts.on.java.jpa21.entity.graph.model.Order, querySpaceUid=, path=blog.thoughts.on.java.jpa21.entity.graph.model.Order)- CollectionAttributeFetchImpl(collection=blog.thoughts.on.java.jpa21.entity.graph.model.Order.items, querySpaceUid=, path=blog.thoughts.on.java.jpa21.entity.graph.model.Order.items)- (collection element) CollectionFetchableElementEntityGraph(entity=blog.thoughts.on.java.jpa21.entity.graph.model.OrderItem, querySpaceUid=, path=blog.thoughts.on.java.jpa21.entity.graph.model.Order.items.)- QuerySpaces- EntityQuerySpaceImpl(uid=, entity=blog.thoughts.on.java.jpa21.entity.graph.model.Order)- SQL table alias mapping - order0_- alias suffix - 0_- suffixed key columns - {id1_2_0_}- JOIN (JoinDefinedByMetadata(items)) :  -> - CollectionQuerySpaceImpl(uid=, collection=blog.thoughts.on.java.jpa21.entity.graph.model.Order.items)- SQL table alias mapping - items1_- alias suffix - 1_- suffixed key columns - {order_id4_2_1_}- entity-element alias suffix - 2_- 2_entity-element suffixed key columns - id1_0_2_- JOIN (JoinDefinedByMetadata(elements)) :  -> - EntityQuerySpaceImpl(uid=, entity=blog.thoughts.on.java.jpa21.entity.graph.model.OrderItem)- SQL table alias mapping - items1_- alias suffix - 2_- suffixed key columns - {id1_0_2_}2014-04-07 20:08:15,260 DEBUG [org.hibernate.loader.entity.plan.EntityLoader] (default task-2) Static select for entity blog.thoughts.on.java.jpa21.entity.graph.model.Order [NONE:-1]: select order0_.id as id1_2_0_, order0_.orderNumber as orderNum2_2_0_, order0_.version as version3_2_0_, items1_.order_id as order_id4_2_1_, items1_.id as id1_0_1_, items1_.id as id1_0_2_, items1_.order_id as order_id4_0_2_, items1_.product_id as product_5_0_2_, items1_.quantity as quantity2_0_2_, items1_.version as version3_0_2_ from purchaseOrder order0_ left outer join OrderItem items1_ on order0_.id=items1_.order_id where order0_.id=?

结论

在第一篇文章中定义了命名实体图之后 ,我们现在使用EntityGraph API定义动态实体图。 使用此实体图,我们可以仅从数据库中查询一次就获取多个实体的图。 这可用于解决LazyInitializationException并提高应用程序的性能。

您如何看待(动态)实体图? 从我的角度来看,与JPA 2.0相比,这是一个非常有用的扩展。 特别是动态实体图对于基于运行时信息(例如方法参数)定义获取策略很有用。

翻译自: https://www.javacodegeeks.com/2014/05/jpa-2-1-entity-graph-part-2-define-lazyeager-loading-at-runtime.html

JPA 2.1实体图–第2部分:在运行时定义延迟/急切加载相关推荐

  1. JPA 2.1实体图–第1部分:命名实体图

    延迟加载通常是JPA 2.0的问题. 如果要使用FetchType.LAZY(默认)或FetchType.EAGER来加载关系,则必须在实体上进行定义,并且始终使用此模式. 仅当我们要始终加载关系时才 ...

  2. Typora搭建图床解决上传md文档图片无法加载的问题

    Typora搭建图床||解决上传md文档图片无法加载的问题 写在前面 写下这篇文章的时候,据说好像是gitee官方禁止了图床上传方面的功能,我做了尝试是报了403错误,只能说错不在我咯,哈哈.所以说这 ...

  3. JPA/hibernate懒加载原理分析及JSON格式API反序列化时连环触发懒加载问题的解决

    什么是懒加载 JPA是java持久层的API,也就是java官方提供的一个ORM框架,Spring data jpa是spring基于hibernate开发的一个JPA框架.Spring data j ...

  4. 20张图助你了解JVM运行时数据区,你还觉得枯燥吗?

    我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了.相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开"运行时数据区"的 ...

  5. delphi控件切图界面闪烁_8、控件系列之_加载占位图+页面指示器

    Skeleton Screen/加载占位图 Skeleton Screen(加载占位图)是近年流行的加载控件,通常表现形式是在界面上待加载区域填充灰色的占位图,与线框图的效果非常相似.Skeleton ...

  6. jpa 实体图查询_JPA实体图

    jpa 实体图查询 JPA 2.1的最新功能之一是可以使用实体图指定获取计划. 这很有用,因为它允许您自定义使用查询或查找操作检索的数据. 在使用中大型应用程序时,通常以不同的方式显示来自同一实体的数 ...

  7. 1.0jpa 2.0_JPA 2.1实体图–第1部分:命名实体图

    1.0jpa 2.0 延迟加载通常是JPA 2.0的问题. 如果要使用FetchType.LAZY(默认)或FetchType.EAGER来加载关系,则必须在实体上进行定义,并且始终使用此模式. 仅当 ...

  8. 前端性能优化之jQuery按需加载轮播图

    引言 关于幻灯轮播图,想必大家都不陌生,尤其是基于 jQuery 的,插件.代码网上一搜一大堆,但是真正符合自己需求的几乎没有,所以我要打造一个符合自身需求,经得起广大网民考验的 jQuery 轮播图 ...

  9. 5.1 Tensorflow:图与模型的加载与存储

    这里写目录标题 前言 快速应用 存储与加载,简单示例 存储的文件 tf.train.Saver与存储文件的讲解 核心定义 存储文件的讲解 保存图与模型进阶 按迭代次数保存 按时间保存 更详细的解释 前 ...

最新文章

  1. webpack打包缓存_【第835期】Webpack 的静态资源持久缓存
  2. Spring AOP注解方式实现
  3. c语言命名规则_C语言的基本数据类型及变量
  4. Linux c 进程名 pid,Linux C已知进程名字得到其PID号
  5. python实现柱状图_python3+PyQt5实现柱状图
  6. 绝地求生更新完后显示服务器忙,绝地求生2月1日更新好了吗?更新后提示服务器繁忙怎么办?...
  7. CSS属性之position
  8. JAVA开发一个合并单元格报表,纵向同值单元格的合并
  9. linux扫描后台地址,Linux如何查看和控制进程
  10. 中文ocr-Benchmarking Chinese Text Recognition: Datasets, Baselines, andan Empirical Study
  11. 谁知道下面这个视频中的特效是用什么软件做的?
  12. 微信小程序的简单登录
  13. 关于服务器基本概念汇总
  14. Navicat导出数据库表
  15. BMZCTF WEB WEB_penetration
  16. 计算机网络实验1 网线、配线架与机柜
  17. 众筹网站项目第七天之用户角色分配(1)
  18. Blender中文场景概念原画创作教程
  19. java iplimage 头文件_JavaCV – 为什么IplImage.createFrom(image)不再存在?
  20. C#中Crystal Report 'crdb_adoplus.dll' could not be loaded的解决办法

热门文章

  1. java快排原理_Java数据结构与算法——快速排序
  2. kafak消费者从头开始消费(消费者组)
  3. mysql体系结构和存储引擎
  4. Java bytecode instruction listings
  5. 如何把模型表导入数据库
  6. 夜神模拟器模拟安卓测试_使用模拟进行测试
  7. docker 镜像选择_为什么选择Docker?
  8. 并发运行的最佳实践_并发最佳实践
  9. jdk 8 集合对象排序_使用JDK 8流在包装对象的集合和包装对象的集合之间转换
  10. null导入失败_当null检查非常失败时