Hibernate关联对象加载策略

Hibernate的抓取策略,又称为加载策略,决定了在何种情况下以及如何从数据库中加载关联对象。
主要有以下几种抓取策略:

  1. 延迟加载(Lazy Loading / FetchType.LAZY)

    • 默认情况下,关联对象在初始化时不被加载,仅当第一次尝试访问关联对象的属性时,Hibernate才会发起查询去加载关联数据。这种策略有助于减少不必要的数据库查询,提高性能。
    @ManyToOne(fetch = FetchType.LAZY)
    private Department department;
    
  2. 立即加载(Eager Loading / FetchType.EAGER)

    • 在查询主对象时,立即执行关联对象的查询,一次性将所需数据全部加载到内存中。如果关联数据量较大,可能会增加内存消耗和数据库压力。
    @ManyToOne(fetch = FetchType.EAGER)
    private Department department;
    
  3. 链接抓取(JOIN Fetching)

    • 在查询主对象时,使用SQL JOIN操作来同时获取关联对象,避免发出额外的SQL查询。在Hibernate中,可以通过HQL或注解查询指定JOIN抓取。
    @Entity
    @Table(name = "users")
    public class User {
        // ...
        @ManyToOne(fetch = FetchType.LAZY)
        @Fetch(FetchMode.JOIN)
        private Role role;
    }
    

    或者在HQL查询中:

    from User u left join fetch u.role
    
  4. 查询抓取(Select Fetching)

    • 默认的抓取策略,当访问懒加载的关联对象时,单独发出SELECT语句来获取关联数据。
  5. 子查询抓取(Subquery Fetching)

    • 使用子查询来获取关联对象,适合于某些特定情况下的性能优化。
  6. 批量抓取(Batch Fetching)

    • 用于优化关联对象的加载,当多次加载同一类型关联对象时,通过一次查询获取多个关联对象,减少SQL查询次数。在映射文件或注解中使用@BatchSize配置。
    @Entity
    @Table(name = "users")
    public class User {
        // ...
        @OneToMany(mappedBy = "user")
        @BatchSize(size = 20)
        private List<Order> orders;
    }
    

7、get与load

  • get:立即检索。get方法一执行,立即查询所有字段的数据。session.get(Users.class, 1);
  • load:延迟检索。默认情况,load方法执行后,如果只使用OID的值不进行查询,如果要使用其他属性值将查询 。
  • 如果是:lazy=true,表示延迟检索,如果设置false表示立即检索。session.load(Users.class, 1);
  • load方法过程:一级缓存 ---> 二级缓存 ----> DB访问 ---> 填充一级缓存[、二级缓存] / 返回一个代理类

image.png

posted @   汉源魂  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示