hibernate的抓取策略(fetch和lazy)

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完成。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值