1,类级别:
通过load方法获取数据的时候,默认是懒加载的。如果是懒加载,则通过load方法获取数据时,只获取了id的值,只有使用到其他字段的值得时候,hibernate才会生成sql语句查询。可以在PO类对应的hbm.xml文件的<class>中配置lazy属性为false取消延迟加载。取消以后,通过load方法查询的时候,通过id查询,就会生成sql语句查询整条数据记录。
2,集合级别:
<set>集合的懒加载,在hbm.xml文件中的<set>元素中添加lazy为false,取消懒加载。
3,在1对多和多对多中,可以使用两个属性lazy和fetch。
(1)fetchjoin:迫切左外连接,查询所有结果,包括子表中的相关数据,且只有一条sql语句。
(2)fetchselect: lazy为false时,将立即加载所有数据。在一对多的情况下,查询主表的数据,也会同时将从表的所有数据查询出来。生成两条sql语句,一条查询主表所有数据,一套查询所有子表数据。
Lazy为true时,默认的懒加载,在需要时才进行查询。查询主表数据,生成一条sql语句,这时不会查询子表的数据,只有用到子表的数据的时候,才会生成sql语句查询子表数据,之后不会再生成sql语句。
Lazy为extra时,非常懒惰,需要时进行查询。查询主表数据的时候,不会查询子表数据,访问子表数据的时候才会查询子表数据,但是,查询的更具体。例如,我们程序中要查询的是子表集合的size(),那么生成的子表查询语句不是将所有的数据查询出来,而是通过count(*)的方式查询有多少条数据,也就是说,你只要数据的条数,我就只给你数据的条数,你需要具体字段的数据的时候,我才生成查询具体数据的sql语句。
(3)fetchsubselect:
使用子查询生成sql语句。生成的sql查询语句不一样,通过in(select ...)的形式进行子查询。
4,在多对1,1对1中,也是通过两个属性lazy和fetch。
Fetch的取值:join,select
Lazy的取值:false,proxy,no-proxy
(1)Fetch=”join”是迫切左外连接,与上面一样。
(2)Fetch=”select”lazy=”false”立即查询,将所有数据都查询出来。
(3)Fetch=”select”lazy=”proxy”代理,指的是一方的类级别的延迟策略将是当前的延迟策略。
在hbm.xml中的<many-to-one>中添加属性:fetch=”select” lazy=”proxy”。
例如,Order和Customer表,Customer是主表,Order是从表,即一个Customer对应多个Order,如果我们为Order.hbm.xml中的<many-to-one>中配置了fetch=”select” lazy=”proxy”,意思是将主动权交给Customer,如果我们在Customer的<class>中配置lazy=”false”,即类级别。
这个proxy代理的意思就是将权限交个对方了,在Customer中配置类级别懒加载为false,在查询Order的时候,就会将Customer查询出来,也就是说,将权限交给了Customer以后,查询动作将由Customer完成。