Hibernate框架-----属性延迟加载和关系延迟加载(七)

属性的延迟:

我们之前在获取一条数据的时候采用的都是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>
将其中的lazy="false"改为true,表示通过Category获取的属性product是延迟加载的。

测试代码:

//获取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为false时 ,打印结果:


当lazy为true时,打印结果:


通过上面两类测试我们发现,当非延迟加载时,当session获取数据库中的一条记录时,不仅是查询了category表的信息,也一并查了product_表的信息和数据。

但是当为延迟加载时,只有在通过category获取products的时候,才会查询product_表的信息,也就是说,加载某个实体时,会对这个实体中的集合属性值采用延迟加(一对多)。再上升一点,就是在加载某个实体时,会对实体所单端关联(one-to-many,many-to-one)的另一个实体对象采用延迟加载。

这就是延迟加载和非延迟加载的区别。


那么,为什么要用延迟加载呢?

延迟加载,也叫延迟实例化,延迟初始化等,它的主要作用就是,把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建。这种方式避免了性能的浪费。

这块,是不是想到了设计模式中的单利模式,分为的懒汉式和饿汉式







评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人圭先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值