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. ...
随机推荐
- Hibernate,JPA注解@PrimaryKeyJoinColumn
一对一(One-to-one),主键关联 用例代码如下: 数据库DDL语句 1,CAT表 create table CAT ( id CHAR) not null, create_time ), up ...
- ecshop后台增加模板页的方法
CShop的动态模板机制是一个非常灵活的系统,管理员可以在后台根据自己的要求调整模板模块的显示位置.本文详细讲解了如何修改ECSHOP内部结构使得用户可以添加自己的模板页从而方便灵活的使用系统自带的模 ...
- MySQL连接字符串总结
一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接 Driver={MySQL};Server=localhost;Option=16834 ...
- java 类型转化
String 转int s="12345"; int i; 第一种方法:i=Integer.parseInt(s);;//直接使用静态方法,不会产生多余的对象,但会抛出异常 第二种 ...
- win7中sql2005 连接其它sql2005服务器,连不上
1.在管理工具-->高级安全 Windows 防火墙下配置下入站规则,将sql的端口加入里面,关闭防火墙并没有把这个给关闭掉 2 .Sql Server Browser 启用3.客户端协议 tc ...
- Java学习之路(二)
什么是变量? 1:计算机是一种嫉妒精确的机器 2:要将信息存储在计算机当中,就必须指明信息存储的位置和所需的内存空间: 3:在Java当中 使用声明语句来完成上述任务 变量的类型:
- 【20160924】GOCVHelper 图像增强部分(1)
图像增强是图像处理的第一步.这里集成了一些实际使用过程中有用的函数. //读取灰度或彩色图片到灰度 Mat imread2gray(string path){ Mat sr ...
- UVa 213,World Finals 1991,信息解码
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- java实现多线程断点续传,上传下载
采用apache 的 commons-net-ftp-ftpclient import java.io.File; import java.io.FileOutputStream; import ja ...
- FileInputstream的available()方法
摘自:http://greemranqq.iteye.com/blog/2051487