什么是懒加载?
Hibernate提供了一种机制,即在设置了使用懒加载的情况下,查询某一条数据时不会立即访问数据库,因此不会返回指定对象,而是返回代理对象,该代理对象并不为null,它实际上是Hibernate自动实现的指定对象所属类的子类的对象,该对象具有默认值.当要使用真正对象的属性的时候才会访问数据库,这时代理对象会自动查询数据库中对应对象的数据并返回.
这样一来降低了程序对数据库访问次数和内存使用量.下面我们通过懒加载适用情况分析它究竟是如何做到的.
懒加载的适用情况?
1.获取某一个对象数据时
Hibernate中的查询方法有两个:get()和load(),正如上面介绍什么是懒加载一样,调用load()可以使用懒加载的特性,但使用get()就不行了.当调用session上的load()加载一个实体时,如果页面并没有调到除主键外的其他属性,是不会查询数据库的,而只有要得到非主键属性时才会去查询,发送查询语句.
2.获取某一个对象的集合属性值时(一对多/多对多关联)
在这种情况下,主表的每一个记录都关联了从表的多条记录,如果没有懒加载,每查询一个主表记录都会连带查询出关联的所有从表记录.举个例子,班级关联了学生:
classes.java:
/** * 行政班中的学生 */ @OneToMany(cascade=CascadeType.ALL,mappedBy="classes",fetch=FetchType.LAZY, targetEntity=Student.class) @JsonIgnore private Set<Student> students =new HashSet<Student>();
Student.java:
/** * 学生所属行政班 */ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = Classes.class) @JoinColumn(name = "calssesId", nullable = false) private Classes classes;
在查询班级信息时,因为暂时不需要展示学生信息,因此并不希望把班级下面关联的所有学生都查询出来,因为这样会大大增加与数据库交互的成本.采用懒加载,Hibernate会先返回一个代理对象然后在需要展示学生信息的时候自动发送语句查询相关数据.
3.获取某一个对象所关联的另一个对象时(一对一/多对一关联)
一对一和多对一的关联方式相同,在一对一关联中懒加载并不常用,因为主表中的每一条数据只对应从表的一条数据,就算全部查询也不会太多.而多对一关联默认是懒加载的.
懒加载的基本原理和适用情况就是这样,因为懒加载涉及到session开闭的问题,所以当延迟加载某些属性时可能session已经关闭了,这时候就会出现懒加载异常.解决这个问题也非常简单,但前提是session在一个容器中,关于这部分的大餐,我们明天继续享用.
版权声明:本文为博主原创文章,未经博主允许不得转载。