懒加载与急加载FetchType.LAZY&FetchType.EAGER的区别和使用?

发布时间 2023-06-17 18:32:25作者: 且行且思
1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
3、比方User类有两个属性,name跟address,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。
 
    @OneToMany(targetEntity = DcyRightImage.class,cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
    @JoinColumn(name = "geo_id", referencedColumnName = "id")
    private Set<DcyRightImage> images;

    @OneToMany(targetEntity = DcyRightVideo.class,cascade = {CascadeType.ALL},fetch = FetchType.EAGER)
    @JoinColumn(name = "geo_id", referencedColumnName = "id")
    private Set<DcyRightVideo> videos;

 

fetch策略

@OneToMany(mappedBy="image",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@Fetch(value=FetchMode.SUBSELECT)

两者比较:
两者都是设定关联对象的加载策略。前者是JPA标准的通用加载策略注解属性,
后者是Hibernate自有加载策略注解属性。

FetchType可选值意义与区别如下:
FetchType.LAZY: 懒加载,在访问关联对象的时候加载(即从数据库读入内存)
FetchType.EAGER:立刻加载,在查询主对象的时候同时加载关联对象。


FetchMode可选值意义与区别如下:
@Fetch(FetchMode.JOIN): 始终立刻加载,使用外连(outer join)查询的同时加载关联对象,忽略FetchType.LAZY设定。
@Fetch(FetchMode.SELECT) :默认懒加载(除非设定关联属性lazy=false),当访问每一个关联对象时加载该对象,会累计产生N+1条sql语句
@Fetch(FetchMode.SUBSELECT)  默认懒加载(除非设定关联属性lazy=false),在访问第一个关联对象时加载所有的关联对象。会累计产生两条sql语句。且FetchType设定有效