JPA的延时加载分成两种情况1.表间的延时加载,2.表中属性的延时加载,比如大型字段blob,需等到使用时在加载,效率才比较高
首先,1.表间的延时加载
JPA中数据获取(Fectching)有两种方式:Eager和Lazy。明白他们之间的差异和知道何时应用哪种方式对于有效率地进行数据库操作非常关键。
Lazy: 只有需要的时候才将相关联的实体取出
Eager: 一次将所有相关联的实体取出
使用的方法如下:
java 代码
关系类型后使用fetch元素。通常Eager是低效率的,因为他将整个关系映射图取出。例如我们有多个消费者,每个消费者有多个订单,每个订单有多个订货商品。如果我们对所有关系全部使用Eager方式,那么仅仅是查询一些消费者就可能产生巨大的对象图,包括了符合查询条件的消费者,以及每个消费者的所有订单,以及每个订单的所有订货商品。这会导致严重的负载问题。如果你在一个持久上下文中操作一些受管理的实体(Managed Entity),那么使用Lazy方式更加有效率。在大部分情况下,只有需要时,相关联实体才会被加载。
更加细粒度的数据获取控制可以通过使用Lazy方式和获取联合来(fetch joins)完成。如果查询没有显式指定fetch joins,则使用Lazy方式获取数据,如果查询指定了fetch joins,在joins中的实体将使用Eager方式获取数据。
2.表中属性的延时加载
@Lob
默认情况下,JPA 持续性提供程序假设所有持久数据均可以表示为典型的数据库数据类型。
结合使用 @Lob 批注与 @Basic 映射,以指定持久属性或字段应作为大型对象持久保存到数据库支持的大型对象类型。
Lob 可以是二进制类型或字符类型。持续性提供程序从持久字段或属性的类型推断出 Lob 类型。
对于基于字符串和字符的类型,默认值为 Clob。在所有其他情况下,默认值为 Blob。
还可以使用 @Column 属性 columnDefinition 进一步改进 Lob 类型。
此批注没有属性。有关更多详细信息,请参阅 API。
示例 1-46 显示了如何使用此批注指定持久字段 pic 应作为 Blob 进行持久保存。
示例 1-46 @Lob
@Entitypublic class Employee implements Serializable { ...
@Lob
@Basic(fetch=LAZY)
@Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
protected byte[] pic; ...}