hibernate(三)检索属性配置
检索即对象的获取:获取的时机和和方式:减少没必要的内存占用,尽量少的sql语句减少多余数据库的访问
一:类级别的检索:load() 和属性<class lazy=true>
.无论 <class> 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略;仅对load()有效
2.默认是延迟加载的即lazy=true;当使用对象属性的时候才真正获取对象(前提是load());
3.根据是获取引用还是属性,是否使用延迟加载;
4.实现延迟加载的原理是使用cglib代理,根据id获取对象时,返回的代理对象只对oid初始化,使用到其他属性才进行初始化代理实例。
二。一:关联对象(一对多和多对多的情况)的检索;<set >元素的 lazy, batch-size fetch 属性值
<set >元素的 lazy属性
1.默认是懒加载关联的集合对象 默认set元素的lazy=true;在使用集合元素并且集合的iterator(), size(), isEmpty(), contains() 等方法也会初始化代理对象。
2在延迟加载的情况下,也可显示的初始化:通过 Hibernate.initialize() 静态方法
3..值可以是lazy=extra :即增强的延迟加载;尽可能延迟加载,如果只是集合的iterator(), size(), isEmpty(), contains() 等方法,只会用特殊的查询语句不会查询具体的数据;(一般不用,因为要得到数据最终还是需要发送语句去查询具体数据)
4.一般不设置为false:有时候并不需要关联对象;在使用一条语句获取第一个对象时,同时再使用一条语句获取关联的对象集合;
<set> 元素 batch-size 属性:用来为延迟检索策略或立即检索策略设定批量检索的数量. 批量检索能减少 SELECT 语句的数目,
一般情况下:
在获取每个客户对应的订单集合对象时,一个客户发送一条语句查询数据;
而通过设置batch-size="数量",让同一种方式获取同一类的对象用in语句(from order where customerId in(客户Id ,..))查询出来,设置的数量决定语句in的客户id数量;
查询语句的数量由总数量和每次查询的数量(batch-size)决定;
<set> 元素的 fetch 属性: 取值为 “select” 或 “subselect” 时, 决定初始化 orders 的查询语句的形式(相当于最大的batch-size值); join值决定加载的时机和方式;
1.默认是select 即普通查询:需参考其他属性;
2.值为subselect时,将忽略batch-size属性,但lazy属性有效;通过一条语句给所有客户关联的集合初始化;因为通过子查询将所有的客户id查出来作为外部语句in的元素(where customerid in(子查询客户id);(注意上面所说的所有(的客户id),只是上条语句查询到session中的客户对象)
3.为 “join” 时:在非Query 的list() 方法获取对象时;将忽略lazy属性(当然batch-size属性此时忽略不忽略没有意义因为它是对于多个对象获取其关联的集合):检索 Customer 对象时, 会采用迫切左外连接(通过左外连接加载的方式使用一条语句把客户和订单数据都获取到)策略来检索所有关联的 Order 对象
二。二(多对一和一对一》many-to-one ><one-to-one>的lazy属性;
lazy属性:
1.lazy默认是proxy:延迟加载
2.lazy为false:立即检索,执行两条语句,一条查询订单,一条查询客户,而查询客户对象时,受到客户对象的配置影响查询的方式不一样(因为是否需要查询出客户中引用的订单)
属性fetch=join:
1.即迫切左连接的方式;一次性将对象及关联对象初始化;
属性bathc-size 注意是<class>元素的属性
一般情况下:
查询每个订单关联的客户都有执行一条查询语句;
用batch-size的值设置数量;使用一条语句(in的方式)给多少个订单对应的客户对象初始化赋值;
总结:对多和对一相似意义的配置属性的位置是不同的;相同之处是list()获取时属性fetch=join将被忽略;
注意双向的一个问题:一个对象关联一个对象,而关联的对象本身也是关联的,是否是延迟加载的,将决定初始化关系对象的方式;
(是否所有的延迟加载的对象都是代理对象?)
hibernate(三)检索属性配置的更多相关文章
- Spark学习笔记-三种属性配置详细说明【转】
相关资料:Spark属性配置 http://www.cnblogs.com/chengxin1982/p/4023111.html 本文出处:转载自过往记忆(http://www.iteblog.c ...
- Spring Boot 系列(三)属性配置&自定义属性配置
在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...
- hibernate属性配置
数据库中一个字段的默认值设为0,当用hibernate插入数据时,没有对该字段进行操作,结果该字段居然不是0,而是空.后来google了一下,发现应该在.hbm.xml文件中添加一些参数定义(示例中的 ...
- hibernate(三)基本配置,log4j、JUnit配置
一.基本配置 1.<property name="hbm2ddl.auto">update</property> 改项配置有4个选项: validate:当 ...
- Sping Boot入门到实战之入门篇(三):Spring Boot属性配置
该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置. 传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...
- 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略
本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...
- Hibernate的检索方式
Hibernate的检索方式 检索方式(查询的方式) 导航对象图检索方式: 根据已经加载的对象导航到其他对象 Customer customer = (Customer)session.get(Cus ...
- Hibernate持久化类属性映射
Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...
- atitit.atitit.hb many2one relate hibernate 多对一关联配置..
atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2. ...
随机推荐
- 检测内存泄露:Instruments中的Leaks
前言 如果要检测内存泄露,我们会使用Xcode7自带的Instruments中的Leaks工具来检测. 现在的开发环境是ARC,所以很少会出现内存泄漏的情况. 不过我们一定要养好码代码的规范性. 例如 ...
- 将ASCII码位于32~126的95个字符输出到屏幕上,为了美观
//将ASCII码位于32~126的95个字符输出到屏幕上,为了美观.要求小于100的码,前面加一个0,每八个转行class shijixing{ public static void main(St ...
- Unity重力的测试
其实和想象的结果还是有点出入 斜坡测试 (非悬空,直接把地面旋转成斜坡) 在非悬空状态下是不会受到斜坡的影响,只有进入悬空再进入斜坡,才会滑下去 一帧内关闭碰撞器再打开,或者一帧内打开Trigger再 ...
- Unity-Animator深入系列---FAQ
回到 Animator深入系列总目录 Q: 如果想做角色负伤的一套动画,但是又和原有状态机不冲突,只是想换动画剪辑,应该怎么办? A: 新建一个层,设置为同步模式.这时候你不能在同步层添加状态,但你可 ...
- Linux下缓冲区溢出攻击的原理及对策(转载)
前言 从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用.当函数调用发生时,新的堆栈帧被压入堆栈:当函数返回时,相应的堆栈帧从堆栈中弹出.尽管堆栈帧结构的引入为在高级语言中实现 ...
- 放松时刻——C#分割字符串
让我们来练习一下字符串的分割~把话倒过来说: private void change_button_Click(object sender, EventArgs e) { var after_text ...
- php基础复习(3)文件上传于下载
一. 客户端配置: 表单页面 表单的发送方式是post 添加enctype = “multipart/form-data” <form action="doaction.php&q ...
- ubuntu16.04 搭建 Mysql服务器
ubuntu16.04 安装 mysql5.7 ,并配置远程访问 安装mysql及其可选组件 apt-get install mysql-serverapt-get install mysql-cli ...
- TortoiseGit安装与配置
TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...
- Struts2的处理结果(三)——动态配置结果
Struts2的处理结果(三) --动态配置结果 1.使用表达式语法 示例: <struts> <constant name="struts.enable.DynamicM ...