hibernate框架提供的检索策略有立即检索、延迟检索、预先检索和批量检索。

帖子(Topic)与回复(Reply)之间是一对多的关联关系。

Topic类:

public class Topic {private int id;private String title;private Date createDate;private String content;private Set<Reply> replys = new HashSet<Reply>();//省略getter、setter方法
}

Reply类:

public class Reply implements Serializable{private int id;private Date createDate;private String content;private Topic topic;//省略getter、setter方法
}

一、立即检索策略:

立即检索指的是在加载一个对象时不仅立即加载该对象,并且还会立即加载与该对象相关联的其他对象。例如:查询一个帖子信息时,会将该帖子所关联的所有回复查询出来。

(1)Annotation:

使用fetch=FetchType.EAGER

@Entity
public class Topic {private int id;private String title;private Date createDate;private String content;private Set<Reply> replys = new HashSet<Reply>();@Id@GeneratedValuepublic int getId() {return id;}@OneToMany(mappedBy="topic",fetch=FetchType.EAGER)  //一对多默认fetch = FetchType.LAZYpublic Set<Reply> getReplys() {return replys;}//省略getter、setter方法
}

(2)xml:

需要将<class>元素和<set>元素内的lazy属性值都设为false。

 <class name="Topic" table="Topic" lazy="false"><id name="id"><column name="id"/><generator class="native"/></id><property  name="title"/><property  name="createDate"/><property  name="content"/><set  name="replys" lazy="false"><key column="topicid"/><one-to-many class="com.SearchStrategy.Immediately.Reply"/></set></class>

测试语句:

session.createQuery("from Topic").list();

hibernate发出的SQL语句:

//Annotation配置:
Hibernate: selecttopic0_.id as id0_,topic0_.content as content0_,topic0_.createDate as createDate0_,topic0_.title as title0_ fromTopic topic0_
Hibernate: selectreplys0_.topicId as topicId0_1_,replys0_.id as id1_1_,replys0_.id as id1_0_,replys0_.content as content1_0_,replys0_.createDate as createDate1_0_,replys0_.topicId as topicId1_0_ fromReply replys0_ wherereplys0_.topicId=?
Hibernate: ....  //省略N条reply的SQL查询语句,N对应于Topic表的条数
//xml配置:
Hibernate: selecttopic0_.id as id0_,topic0_.title as title0_,topic0_.createDate as createDate0_,topic0_.content as content0_ fromTopic topic0_
Hibernate: selectreplys0_.topicid as topicid0_2_,replys0_.id as id1_2_,replys0_.id as id1_1_,replys0_.createDate as createDate1_1_,replys0_.content as content1_1_,replys0_.topicId as topicId1_1_,topic1_.id as id0_0_,topic1_.title as title0_0_,topic1_.createDate as createDate0_0_,topic1_.content as content0_0_ fromReply replys0_ left outer joinTopic topic1_ on replys0_.topicId=topic1_.id wherereplys0_.topicid=?
Hibernate: ....  //省略N条reply的SQL查询语句,N对应于Topic表的条数

二、延迟加载策略

延迟加载是指对象在使用到时才会进行加载。

(1)Annotation:

@Entity
public class Topic {private int id;private String title;private Date createDate;private String content;private Set<Reply> replys = new HashSet<Reply>();@Id@GeneratedValuepublic int getId() {return id;}@OneToMany(mappedBy="topic",fetch=FetchType.LAZY)  //一对多默认fetch = FetchType.LAZYpublic Set<Reply> getReplys() {return replys;}//省略getter、setter方法
}

(2)xml:

需要将<class>元素和<set>元素内的lazy属性值都设为true。

 <class name="Topic" table="Topic" lazy="true"><id name="id"><column name="id"/><generator class="native"/></id><property  name="title"/><property  name="createDate"/><property  name="content"/><set  name="replys" lazy="true"><key column="topicid"/><one-to-many class="com.SearchStrategy.Delay.Reply"/></set></class>

测试语句:

session.createQuery("from Topic").list();

hibernate发出的SQL语句:

Hibernate: selecttopic0_.id as id0_0_,topic0_.content as content0_0_,topic0_.createDate as createDate0_0_,topic0_.title as title0_0_ fromTopic topic0_ wheretopic0_.id=?

三、预先加载策略

预先加载指的是一种通过左外连接来获得对象关联实例或者集合的检索方法,主要用于关联级别的查询。

(1)xml:

将<set>元素内的fetch属性值都设为join。

 <class name="Topic" table="Topic" lazy="false"><id name="id"><column name="id"/><generator class="native"/></id><property  name="title"/><property  name="createDate"/><property  name="content"/><set  name="replys" lazy="false" fetch="join"><key column="topicid"/><one-to-many class="com.SearchStrategy.Beforehand.Reply"/></set></class>

测试语句:

session.createQuery("from Topic").list();

hibernate发出的SQL语句:

Hibernate: selecttopic0_.id as id0_,topic0_.title as title0_,topic0_.createDate as createDate0_,topic0_.content as content0_ fromTopic topic0_
Hibernate: selectreplys0_.topicid as topicid0_2_,replys0_.id as id1_2_,replys0_.id as id1_1_,replys0_.createDate as createDate1_1_,replys0_.content as content1_1_,replys0_.topicId as topicId1_1_,topic1_.id as id0_0_,topic1_.title as title0_0_,topic1_.createDate as createDate0_0_,topic1_.content as content0_0_ fromReply replys0_ left outer joinTopic topic1_ on replys0_.topicId=topic1_.id wherereplys0_.topicid=?
Hibernate: ....  //省略N条reply的SQL查询语句,N 对应于Topic表的条数

四、批量检索策略

又分为批量立即检索和批量延迟检索两种。

1. 批量立即检索:

批量立即检索是利用hibernate批量初始化要检索的实体类对象实例,发出批量查询SQL语句,从而减少SQL语句数量。

(1)Annotation:

使用@BatchSize(size=2)注解,不过使用hibernate4测试该注解无效。

(2)xml:

将<class>元素和<set>元素的lazy属性都设为false,并在<set>元素内添加batch-size属性。

 <class name="Topic" table="Topic" lazy="false"><id name="id"><column name="id"/><generator class="native"/></id><property  name="title"/><property  name="createDate"/><property  name="content"/><set  name="replys" lazy="false" batch-size="3"><key column="topicid"/><one-to-many class="com.SearchStrategy.Batch.Reply"/></set></class>

测试语句:

session.createQuery("from Topic").list();

hibernate发出的SQL语句:

Hibernate: selecttopic0_.id as id0_,topic0_.title as title0_,topic0_.createDate as createDate0_,topic0_.content as content0_ fromTopic topic0_
Hibernate: selectreplys0_.topicid as topicid0_2_,replys0_.id as id1_2_,replys0_.id as id1_1_,replys0_.createDate as createDate1_1_,replys0_.content as content1_1_,replys0_.topicId as topicId1_1_,topic1_.id as id0_0_,topic1_.title as title0_0_,topic1_.createDate as createDate0_0_,topic1_.content as content0_0_ fromReply replys0_ left outer joinTopic topic1_ on replys0_.topicId=topic1_.id wherereplys0_.topicid in (?, ?, ?)
Hibernate: ....  //省略 n 条reply的SQL查询语句,n 对应于Topic表的条数/batch-size +1

转载请注明转自本文,原文链接:http://blog.csdn.net/czw2010/article/details/8316413

hibernate数据检索策略相关推荐

  1. 不同的Hibernate命名策略

    本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.imp ...

  2. hibernate jpa_JPA /Hibernate刷新策略初学者指南

    hibernate jpa 介绍 在我以前的文章中,我介绍了实体状态转换 对象关系映射范例. 当刷新当前持久性上下文时,所有管理实体状态转换都将转换为关联的数据库语句. Hibernate的刷新行为并 ...

  3. Hibernate数据检索 QB查询

    回顾: 1.inverse=true     2.多对多关系的中间表 Hibernate数据检索 内容:  本章讲解了Hibernate中的两种查询操作的使用:Criteria.HQL,并介绍了各自的 ...

  4. Hibernate优化策略

    1.抓取策略: 当提取一个对象的关联对象时,所要求的策略.    fetch="select"       customer:  lazy="false" 或者 ...

  5. (九)Hibernate 检索策略

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 这里的hibernate.cfg.xml配置信息我就不再写了 第一节:检 ...

  6. Hibernate延迟加载策略

    所谓懒加载(lazy)就是延时加载,就是当在真正需要数据的时候,才真正执行数据加载操作 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量, ...

  7. Hibernate学习(八)———— Hibernate检索策略(类级别,关联级别,批量检索)详解...

    序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...

  8. Hibernate检索策略之5.4一对多单向关联检索策略——Hibernate4究竟怎么玩

    今天开始讲一对多单向关联. 转载于:https://www.cnblogs.com/geyifan/archive/2012/09/13/2682669.html

  9. hibernate 插入 效率_Hibernate:检索策略的学习1

    概述 检索数据,也就是查询数据是在一个系统中必不可少的一个功能.检索数据时的2个问题: 不浪费内存:例如,Customer和Order是双向1-N的关系.当 Hibernate 从数据库中加载 Cus ...

最新文章

  1. SDN/NFV运营商商业化部署
  2. 【ds】HDU_1166
  3. unity 继承会调用start吗_【浅入浅出】Unity 雾效
  4. 教你开发jQuery插件(转)
  5. Kotlin系列之枚举类
  6. 数据结构上机实践第五周项目1- 建立顺序栈算法库
  7. mac下Android开发环境搭建
  8. java-->if顺序结构-->骰子游戏(小案例)
  9. QCC3040---earbudUi module
  10. 7步轻松设置授权管理器License Manager
  11. 父债子偿有法可依吗?可法院却对这个案子说:不!
  12. 前端-CSS样式的简单介绍
  13. 信息检索(IR)——索引与检索
  14. openssl HeartBleed漏洞复现
  15. Network 【HTTPS请求/AFN】
  16. iOS 发布证书申请 (转载)
  17. 【BZOJ 2844】 albus就是要第一个出场
  18. 解决IDEA 在使用maven创建项目pom文件project出错的问题(亲测有效)
  19. STM32F103C8移植uCOSIII(HAL库)
  20. 一个获取ip地址的命令详解

热门文章

  1. Mobius反演(莫比乌斯反演)
  2. 数学建模常用模型07 :模糊综合评价法
  3. cpu利用率(cpu利用率突然100)
  4. ogre3D学习基础4 -- 网格工具与硬件缓存
  5. IO流1(字节流+字符流+输入流+输出流+节点流+处理流)
  6. 一起参与开源.共同打造海派开源潮流社
  7. 论文阅读笔记(4)——《Language Generation with Multi-Hop Reasoning on Commonsense Knowledge Graph》
  8. 51单片机之位操作指令SETB、CPL等
  9. 2020年全国大学生电子设计大赛赛后总结
  10. 酷狗音乐关键字搜索并生成下载url