hibernate中三种lazy----对象导航查询

本文详细解析了Hibernate中懒加载机制的使用方式及其配置方法。针对User和Dog的关系映射示例,介绍了如何通过调整lazy属性来控制关联对象的加载时机,帮助开发者优化内存使用和查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是拿User 和 Dog这对关系来说。

一:对于User配置文件中的lazy属性来说,是管查询user对象的时候是否同时查询从表信息。我们一般设置成默认的,也就是lazy=true,因为我们不想加载一个set到内在中占空间,代码如下:

User user = session.get(User.class, Integer.parseInt("1"));//执行完这句后只会有一个select语句,是查询user表的
System.out.println(user.toString());//打印user信息
Set<Dog> dogs = user.getDogs();//不会执行任何操作,不会输出select语句,dogs是没有值的。但是如果你用debug模式然后此时鼠标放到dogs上去的话,会立马去执行查询语句,这点要注意!
System.out.println(dogs);//执行一条select语句查询dog表,并打印输出。

如果配置成false了,执行第一条语句的时候就会直接输出两条select语句。


二:对于Dog配置文件来说,是管是否查询主表信息。我们一般需要改一下,我们需要它是false的,而它默认是proxy:

                Dog dog = session.get(Dog.class, Integer.parseInt("1"));//执行完这句后会立马生成两条select语句
		System.out.println(dog);
		User user = dog.getDogmaster();
		System.out.println(user);

设置成了proxy则会在执行完第四句的时候才会打印另外一条查询语句。


三:配置在class标签中的lazy,是是用来管load方法的,它默认是懒加载的,它只是控制load那个语句执行完后会不会立即查询数据库,并管不了是否立即查询主表信息。

举个栗子:如果把class中lazy设置成true,但把<many-to-one>标签中的lazy属性设置成false,执行如下代码:

Dog dog = session.load(Dog.class, Integer.parseInt("1"));//执行完后并不会生成sql语句的,这是由class标签那个lazy控制的
System.out.println(dog);//执行完马上生成两天select语句,这是由many-to-one那个lazy控制的
User user = dog.getDogmaster();
System.out.println(user);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值