Hibernate支持延迟加载和急加载两种策略。
- 延迟加载(Lazy Loading):
只有在实际需要用到对象的关联属性时,才会发送SQL进行加载。依赖于Hibernate的动态代理机制实现。
可以通过以下方式开启延迟加载:
- 在映射文件中使用fetch=”Lazy”。例如:
<many-to-one name="customer" class="Customer" fetch="Lazy" />
- 使用@Fetch注解,例如:@Fetch(FetchMode.LAZY)
- 全局开启:在hibernate.cfg.xml中配置lazy=”true”
延迟加载可以提高系统性能,因为可以减少无用数据的加载。但是,如果不得不发送大量SQL进行关联查询,也会降低性能。
- 急加载(Eager Loading):
与延迟加载相反,是在加载对象时,直接通过JOIN将相关对象或集合加载出来。
可以通过以下方式开启急加载:
- 在映射文件中使用fetch=”Eager”。例如:
<many-to-one name="customer" class="Customer" fetch="Eager" />
- 使用@ManyToOne(fetch = FetchType.EAGER) 或 @OneToMany(fetch = FetchType.EAGER)
- 全局开启:在hibernate.cfg.xml中配置lazy=”false”
急加载可以避免大量关联查询产生的性能损耗,但是如果关联的数据很多而用不到,会影响系统性能。
所以,两种加载策略各有优劣: - 延迟加载可以提高性能,减少无用数据加载,但是需要生成更多SQL。
- 急加载可以减少SQL查询次数,但是会加载更多无用数据,影响性能。
在实际应用中,一般会综合考虑: - 对经常使用到的关联数据采用急加载,减少数据库交互。
- 对大量关联数据但用不太频繁的采用延迟加载,提高性能。
- 在具体操作中通过fetch=”select”选择不同策略,灵活运用。
理解Hibernate的延迟加载和急加载策略,并学会在项目中灵活运用,可以让我们实现更高的系统性能。