Hibernate数据检索策略

Hibernate数据检索策略:
Hibernate的数据检索策略是面向对象的策略,对于不同的数据检索情况,应使用不同的策略,以提高效率和节省资源。经常使用的是立即检索和延迟检索,预先抓取是同一级别的策略,因为它们是三选一的策略。用了其中一个则另外两个就都不可用,而且被延迟加载的对象当最终被加载时,一定是使用立即加载的形式(指select 语句的形式).

批量检索可以优化立即和延迟加载,它们可以同时用。

(1) 立即检索:
立即检索的配置文件标识符为lazy=”false”.
对象的属性域、一对一关联对象、多对一关联对象,由于这些被关联的对象是”一”这端,适合立即检索。而一对多和多对一关联对象则不适合设为立即检索.比如班级和学生是一对多关系,当取得班级对象时,如果使用立即检索,就会把班级中所有学生对象组装起来,然后把它们放入一个Set集合中,这个Set集合被班级对象引用。
(2) 预先抓取:
Fetch=”join”
预先抓取指的是Hibernate通过select语句使用outer join (外连接,一般是左外连接left outer join)来获得对象的关联实例或者关联集合。

它们之间的区别:
立即加载是立即填充附属物
延迟加载是只有实际使用到附属物时才会被填充。两者select语句形式是一样的,都是通过id一条一条的查出来。
如果关联好多条记录,用立即检索或者延迟检索是不适合的。过多的sql语句必会造成网络传输和响应的延迟,造成整体性能下降。使用预先抓取策略可以减少SQL语句的条数。
实际使用中,一对多和多对多关系推荐使用延迟加载,而一对一和多对一关系推荐使用预先加载。

1. 外连接:
Query  q=session.createQuery(“from  Student as s  left join  s.team”)
Stu.getTeam().getStudents().size() 会报LazyInitializationException异常。
这种指明HQL的方式,将忽略配置文件的所有策略。
2. 预先抓取:
将上面的HQL语句由左外连接改为预先抓取。
Query q=session.createQuery(“from  Student  as s  left join fetch  s.team”)
 
  Hibernate仅在第一层关联时忽略配置文件的预先抓取,在更深的层次,按照配置文件设置的策略取得对象。

批量加载:
 批量加载总是和立即或延迟加载联系在一起的,分为批量立即加载和批量延迟回载,可以用于以下情况:
1. 一对多、多对多(末端为多)的情况,以set为例:
<set name=”students” inverse=”true” batch-size=”3”>
 <key column=”team_id”/>
 <one-to-many class=”model.Student”/>
 </set>
2.  一对一、多对一(末端为一)的情况:如果要对末端为一的关联设置批量加载,要在“一”这端的类配置文件中进行设置,比如学生对班级是多对一关系,要实现对班级的批量加载,应设置如下:
<class name=”model.Team” table=”team” batch-size=”3”>

(1) 批量立即加载:
Query q=session.createQuery(“from Team t”);
如果在配置文件中设置了学生集合为batch-size=3,也就是批量加载学生集合的数量是3,如果有100个班级,因为设置了批量加载,所以要加载100/3=33还有剩一个学生再加载一次,共需要发送SQL语句34次。Batch-size设得太大,将会使延迟加载失去意义。
(2) 批量延迟加载:
如果数据被设置了延迟加载,当此数据最终被加载进来时,也可以对它进行批量加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值