hibernate懒加载 优化性能, get load
属性的延迟:
我们之前在获取一条数据的时候采用的都是Session的get方法,这种方式不是延迟加载,也就是调用这个方法就会立刻访问数据库查出此对象的数据,当我们采用Session的load方法时,采用的是属性延迟加载,就是只有在访问这个对象的属性,hibernate才会访问数据库进行查询。
下面两种代码和测试结果一看就明白。
1.get方法,非延迟
- Product p=(Product)s.get(Product.class, 4);
- System.out.println("没访问属性的时候不会访问数据库");
- System.out.println(p.getName());
- System.out.println("我的上面的几串表示问数据库");
2.load方法,属性延迟加载
- Product p=(Product)s.load(Product.class, 4);
- System.out.println("没访问属性的时候不会访问数据库");
- System.out.println(p.getName());
- System.out.println("我的上面的几串表示问数据库");
上图代码和结果图很好的解释了属性延迟加载。
关系延迟加载
关系延迟加载又叫懒加载,即lazyload,在多对一、多对多中的时候都可以使用关系的延迟加载,这块的修改主要在配置文件,还记得之前的Category类吗?我们修改他的配置文件Category.hbm.xml
- <set name="products" lazy="false">
- <key column="cid" not-null="false"/>
- <one-to-many class="com.vipcpi.Product"/>
- </set>
测试代码:
- //获取id为1的数据
- Category cate=(Category) s.get(Category.class, 1);
- System.out.println("我是打印机1--------------");
- Set<Product> ps=cate.getProducts();
- for(Product p:ps){
- System.out.println(p.getName());
- }
- System.out.println("我是打印机2--------------");
当lazy为true时,打印结果:
通过上面两类测试我们发现,当非延迟加载时,当session获取数据库中的一条记录时,不仅是查询了category表的信息,也一并查了product_表的信息和数据。
但是当为延迟加载时,只有在通过category获取products的时候,才会查询product_表的信息,也就是说,加载某个实体时,会对这个实体中的集合属性值采用延迟加(一对多)。再上升一点,就是在加载某个实体时,会对实体所单端关联(one-to-many,many-to-one)的另一个实体对象采用延迟加载。
这就是延迟加载和非延迟加载的区别。
那么,为什么要用延迟加载呢?
延迟加载,也叫延迟实例化,延迟初始化等,它的主要作用就是,把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建。这种方式避免了性能的浪费。
这块,是不是想到了设计模式中的单利模式,分为的懒汉式和饿汉式。