JPA hibernate FetchType.EAGER LAZY 一对多,多对一 用对象导航查询

本文深入探讨ORM中一查多与多查一场景下,EAGER与LAZY加载策略的区别及其实现原理。通过具体案例,分析不同场景下加载策略的选择对性能的影响,以及如何根据实际需求调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

坑的地方,2个默认不一样,仔细想想符合实际,记法:OL,ME    

    OneToMany.class:     
        FetchType fetch() default FetchType.LAZY;   因为多方数据量大,先find 一  get多 用懒加载    根据实际应用场景,完全有必要懒加载

ManyToOne.class
        FetchType fetch() default FetchType.EAGER;   因为 多 查一,只关联一条主表数据,直接 用立即加载,根据实际应用场景,无所谓

 

一查多   (观察sql日志的from 后是否join
    LAZY:    
        One的get方法时 执行sql获取 多的集合 from 多方数据表 where 外键= 
    EAGER
        findOne一句sql获取全部 from cst_customer customer0_ left outer join
        
    多查一     
    One:默认LAZY
        MANY EAGER:一条sql, join
        MANY LAZY: 两条sql  1sql.查M表,带外键字段     2sql.用外键查 主表
        
    One:EAGER 
        MANY EAGER: get前2条(1.join 已经查了全部数据 ,2多表又去查了自己——感觉多余) 
        MANY LAZY: 2条sql,1多表查自己,2join查主表

视频案例 https://www.bilibili.com/video/av53910024?p=85

多查一时,双 FetchType.EAGER 多表多余sql

Hibernate: select linkman0_.lkm_id as lkm_id1_1_0_,
 linkman0_.lkm_cust_id as lkm_cust9_1_0_,
 linkman0_.lkm_email as lkm_emai2_1_0_,
 linkman0_.lkm_gender as lkm_gend3_1_0_,
 linkman0_.lkm_memo as lkm_memo4_1_0_,
 linkman0_.lkm_mobile as lkm_mobi5_1_0_,
 linkman0_.lkm_name as lkm_name6_1_0_,
 linkman0_.lkm_phone as lkm_phon7_1_0_,
 linkman0_.lkm_position as lkm_posi8_1_0_,
 customer1_.cust_id as cust_id1_0_1_,
 customer1_.cust_address as cust_add2_0_1_,
 customer1_.cust_industry as cust_ind3_0_1_,
 customer1_.cust_level as cust_lev4_0_1_,
 customer1_.cust_name as cust_nam5_0_1_,
 customer1_.cust_phone as cust_pho6_0_1_,
 customer1_.cust_source as cust_sou7_0_1_ from cst_linkman linkman0_ left outer join cst_customer customer1_ on linkman0_.lkm_cust_id=customer1_.cust_id where linkman0_.lkm_id=?

 Hibernate: select linkmans0_.lkm_cust_id as lkm_cust9_1_0_,
 linkmans0_.lkm_id as lkm_id1_1_0_,
 linkmans0_.lkm_id as lkm_id1_1_1_,
 linkmans0_.lkm_cust_id as lkm_cust9_1_1_,
 linkmans0_.lkm_email as lkm_emai2_1_1_,
 linkmans0_.lkm_gender as lkm_gend3_1_1_,
 linkmans0_.lkm_memo as lkm_memo4_1_1_,
 linkmans0_.lkm_mobile as lkm_mobi5_1_1_,
 linkmans0_.lkm_name as lkm_name6_1_1_,
 linkmans0_.lkm_phone as lkm_phon7_1_1_,
 linkmans0_.lkm_position as lkm_posi8_1_1_ from cst_linkman linkmans0_ where linkmans0_.lkm_cust_id=?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值