Hibernate系列之(1) 抓取策略
来源:互联网 发布:制做图表的软件 编辑:程序博客网 时间:2024/06/05 06:17
1. 从一方关联多的一方: Customer-> Orders
在 Customer.hbm.xml 配置文件中:
<class name="com.example.domain.Customer" table="customer" select-before-update="true" lazy="true"> <id name="cid" column="id" > <generator class="native" /> </id> <property name="cname" column="name" /> <set name="orders" cascade="save-update" fetch="join" lazy="true"> <key column="cno"></key> <one-to-many class="com.example.domain.Order"></one-to-many> </set> </class>
set 集合上的属性: fetch、 lazy
fetch 决定发送的SQL语句的类型
lazy 控制关联对象的检索是否采用延迟.,就即决定多的一方Orders
是否延迟加载(注意: class 上的 lazy 属性决定一方Customer
是否支持延迟加载)
fetch:
- select (默认取值), 会发送多条SQL查询关联对象.
- join : 发送迫切左外连接的SQL查询关联对象. fetch=”join” 那么lazy被忽略了.
- subselect :发送子查询查询关联对象.(需要使用Query接口测试)
lazy:
* true :默认值, 查询关联对象的时候使用延迟检索
* false :查询关联对象的时候不使用延迟检索.
* extra :极其懒惰.(例如查询数量,只发送 count 语句)
搭配结果:
1. fetch= select
* lazy=true
,当使用到Order对象时,才会发送查询Order的语句
* lazy=false
, 当查询Customer对象时,就会发送查询 Order 的语句
* lazy=extra
, 当查询 Order 对象时,才会发送查询Order的语句,当只查询数量时,只发送count 语句
fetch=join
, lazy 取值被忽略- 发送迫切左外连接查询
fetch=subselect
- 查询 Order 对象时,发送子查询语句
2. 从多方关联到一方 (Orders->Customer)
在 Order.hbm.xml 文件中配置:
<class name="com.example.domain.Order" table="orders" select-before-update="true" lazy="true"> <id name="oid" column="id" > <generator class="native" /> </id> <property name="addr" column="address" /> <many-to-one name="customer" column="cno" class="com.example.domain.Customer" cascade="save-update" /> </class>
many-to-one 标签中属性: fetch、lazy
fetch:控制SQL语句发送格式
* join :发送一个迫切左外连接查询关联对象.fetch=”join”,lay属性会被忽略.
* select :发送多条SQL检索关联对象.
lazy:关联对象检索的时候,是否采用延迟
* false :不延迟
* proxy :使用代理.检索订单额时候,是否马上检索客户 由Customer对象的映射文件中上lazy属性来决定.
* no-proxy :不使用代理
3. 批量抓取
一方关联多方: Customer->Orders
Customer.hbm.xml
<class name="Person"><set name="cats" batch-size="3">...</set></class>
如果Customer 中有 10 个订单, batch-size 是 3,那么 Hibernate 将会分四次执行 SELECT 查询Order, 按照 3、3、3、1
的大小分别载入数据。这里的每次载入的数据量还具体依赖于当前 Session 中未实例化集合的个数。
多方关联一方: Order->Customer
需求: 查询每个订单对应的 Customer 的名称集合
默认: 查询所有订单,发送一个SQL; 然后对应每个订单查询Customer,发送一个SQL
select customer0_.id as id1_1_0_, customer0_.name as name2_1_0_ from customer customer0_ where customer0_.id=?
在Customer.hbm.xml的 class 标签上添加属性: batch-size=3
注意是 Customer.hbm.xml
不是 Order.hbm.xml
select customer0_.id as id1_1_0_, customer0_.name as name2_1_0_ from customer customer0_ where customer0_.id in ( ?, ?, ? )
- Hibernate系列之(1) 抓取策略
- Hibernate之抓取策略
- hibernate之优化抓取(选择抓取策略之批量预抓取数据--实例1)
- hibernate之优化抓取(选择抓取策略之通过联结即时抓取--实例1)
- Hibernate检索策略学习之--预先抓取
- 【Hibernate】Hibernate性能优化之延迟加载与抓取策略
- Hibernate抓取策略
- Hibernate的抓取策略
- Hibernate Fetch 抓取策略
- hibernate 抓取策略
- Hibernate中的抓取策略
- hibernate抓取策略
- Hibernate------抓取策略
- Hibernate 抓取策略
- hibernate抓取策略
- hibernate抓取策略
- hibernate---->抓取策略
- hibernate 抓取策略
- 那些年踩过的坑(2) Hibernate 和 Struts 的javaassist.jar冲突
- 线程和进程详解
- JavaScript严格模式
- 530. Minimum Absolute Difference in BST
- ccna学习指南,入门必备
- Hibernate系列之(1) 抓取策略
- Wi-Fi产品中的智能天线设计
- 皮格马利翁效应
- mysql索引的实现原理
- Hibernate系列之(2)丢失更新解决
- C和指针第十一章 动态内存分配
- 字符串hash
- xml解析详解
- Linux下 运行apue程序环境配置