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

还是拿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);


猜你喜欢

转载自blog.csdn.net/dimples_qian/article/details/80878603