Hibernate的抓取策略

1.1、 区分延迟和立即检索:

立即检索:

* 当执行某行代码的时候,马上发出SQL语句进行查询.

* get()

延迟检索:

* 当执行某行代码的时候,不会马上发出SQL语句进行查询.当真正使用这个对象的时候才会发送SQL语句.

* load();

1.2、类级别检索和关联级别检索:

类级别的检索:

* <class>标签上配置lazy

关联级别的检索:

* <set>/<many-to-one>上面的lazy.

1.2.1、从一的一方关联多的一方:

* <set>

* fetch:控制sql语句的类型

* join:发送迫切左外连接的SQL查询关联对象.fetch=”join”那么lazy被忽略了.

* select:默认值,发送多条SQL查询关联对象.

* subselect:发送子查询查询关联对象.(需要使用Query接口测试)

* lazy:控制关联对象的检索是否采用延迟.

* true:默认值, 查询关联对象的时候使用延迟检索

* false:查询关联对象的时候不使用延迟检索.

* extra:及其懒惰.

如果fetch是join的情况,lazy属性将会忽略.

1.2.2、在多的一方关联一的一方:

* <many-to-one>

* fetch:控制SQL语句发送格式

* join:发送一个迫切左外连接查询关联对象.fetch=”join”,lay属性会被忽略.

* select:发送多条SQL检索关联对象.

* lazy:关联对象检索的时候,是否采用延迟

* false:不延迟

* proxy:使用代理.检索订单额时候,是否马上检索客户 由Customer对象的映射文件中<class>上lazy属性来决定.

* no-proxy:不使用代理

测试:

package com.sihai.hibernate3.test;import java.util.List;import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;import com.sihai.hibernate3.demo1.Customer;
import com.sihai.hibernate3.demo1.Order;
import com.sihai.utils.HibernateUtils;/*** Hibernate的抓取策略* * @author sihai* */
public class HibernateTest4 {@SuppressWarnings("unchecked")@Test// 批量抓取:// 从订单批量抓取客户// 在Customer.hbm.xml中<class>标签上设置batch-size=""public void demo9(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查询所有的订单:List<Order> list = session.createQuery("from Order").list();for (Order order : list) {System.out.println(order.getCustomer().getCname());}tx.commit();session.close();}@Test// 批量抓取:// 从客户批量抓取订单// <set>标签上设置batch-size=""public void demo8(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查询所有客户List<Customer> list = session.createQuery("from Customer").list();for (Customer customer : list) {for (Order order : customer.getOrders()) {System.out.println(order.getAddr());}}tx.commit();session.close();}@Test// 在Order.hbml.xml中<many-to-one>标签上配置fetch和lazypublic void demo7(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** fetch="select",lazy="false"*/// 查询一号订单//Order order = (Order) session.get(Order.class, 1);// 发送多条SQL查询关联对象// 查询一号订单所属客户的名称://System.out.println("客户名称:"+order.getCustomer().getCname());// 不发送SQL/*** fetch="select",lazy="proxy"* proxy:查询关联对象的时候,是否采用延迟,由另一端的类级别延迟来决定.*    * Customer的<class>上配置的是lazy="true".检索的时候采用延迟*  * Customer的<class>上配置的是lazy="false".检索的时候不采用延迟*/// 查询一号订单Order order = (Order) session.get(Order.class, 1);// 发送多条SQL查询关联对象// 查询一号订单所属客户的名称:System.out.println("客户名称:"+order.getCustomer().getCname());// 不发送SQLtx.commit();session.close();}@Test// 在Order.hbml.xml中<many-to-one>标签上配置fetch和lazypublic void demo6(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** fetch="join",lazy被忽略.*/// 查询一号订单Order order = (Order) session.get(Order.class, 1);// 发送一条迫切左外连接查询关联对象.// 查询一号订单所属客户的名称:System.out.println("客户名称:"+order.getCustomer().getCname());tx.commit();session.close();}@SuppressWarnings("unchecked")@Test// 在Customer.hbm.xml的<set>标签上配置fetch和lazy// fetch="subselect" 子查询public void demo5(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** 配置fetch="subselect" lazy="true"*/
//      List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL
//      for (Customer customer : list) {
//          System.out.println("客户订单数量:"+customer.getOrders().size());// 发送一个子查询去查询关联对象.
//      }// 使用子查询 查询多个的情况./*Customer customer = (Customer) session.get(Customer.class, 1);System.out.println("客户订单数量:"+customer.getOrders().size());*//*** 配置fetch="subselect" lazy="false"*/
//      List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL,发送一个子查询查询订单
//      for (Customer customer : list) {
//          System.out.println("客户订单数量:"+customer.getOrders().size());// 不发送SQL
//      }/*** 配置fetch="subselect" lazy="extra"*/List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQLfor (Customer customer : list) {System.out.println("客户订单数量:"+customer.getOrders().size());// 只发送统计客户订单数量的sqlfor (Order order : customer.getOrders()) {System.out.println(order.getAddr());}}tx.commit();session.close();}@Test// 在Customer.hbm.xml的<set>标签上配置fetch和lazy// fetch="select"public void demo4() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();/*** 配置fetch="select" lazy="true"* * 发送多条SQL.默认值就是fetch="select" lazy="true"*/// 查询一号客户// Customer customer = (Customer) session.get(Customer.class, 1);//发送一条查询客户的SQL// 查看一号客户的订单的数量:// System.out.println("订单的数量:" + customer.getOrders().size());//又发送一条查询订单的SQL/*** 配置fetch="select" lazy="false"*/// 查询一号客户//Customer customer = (Customer) session.get(Customer.class, 1);//发送多条SQL查询// 查看一号客户的订单的数量://System.out.println("订单的数量:" + customer.getOrders().size());//不发送SQL/*** 配置fetch="select" lazy="extra"* * extra:及其懒惰的.*/// 查询一号客户Customer customer = (Customer) session.get(Customer.class, 1);// 发送一条查询客户的SQL// 查看一号客户的订单的数量:System.out.println("订单的数量:" + customer.getOrders().size());// 查询订单的数量:select count(oid) from orders o where o.cid = ? for (Order order : customer.getOrders()) {System.out.println(order);}tx.commit();session.close();}@Test// 在Customer.hbm.xml的<set>标签上配置fetch和lazy// fetch="join",lazy的取值就会被忽略.public void demo3() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查询一号客户Customer customer = (Customer) session.get(Customer.class, 1);// 发送了一条迫切左外连接的SQL// 查看一号客户的订单的数量:System.out.println("订单的数量:" + customer.getOrders().size());// 不发送SQL.tx.commit();session.close();}@Test// 默认的情况下 没有配置任何信息// 发送多条SQL查询其关联对象.public void demo2() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查询一号客户Customer customer = (Customer) session.get(Customer.class, 1);// 发送一条查询客户的SQL.// 查看一号客户的订单的数量:System.out.println("订单的数量:" + customer.getOrders().size());// 使用订单的时候,又会发送一条SQL查询tx.commit();session.close();}@Test// 区分立即和延迟检索public void demo1() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 立即检索// Customer customer = (Customer) session.get(Customer.class, 1);// System.out.println(customer.getCname());// 延迟检索:Customer customer = (Customer) session.load(Customer.class, 1);Hibernate.initialize(customer);System.out.println(customer.getCname());tx.commit();session.close();}
}

hibernate教程--抓取策略详解相关推荐

  1. hibernate教程--抓取策略

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  2. python爬虫beautifulsoup爬当当网_Python爬虫包 BeautifulSoup 递归抓取实例详解_python_脚本之家...

    Python爬虫包 BeautifulSoup  递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到 ...

  3. Python爬虫包 BeautifulSoup 递归抓取实例详解

    Python爬虫包 BeautifulSoup 递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另 ...

  4. hibernate教程--关联关系的映射详解

    1.1 Hibernate关联关系的映射 1.1.1 实体之间的关系: 实体之间有三种关系: * 一对多: * 一个用户,生成多个订单,每一个订单只能属于一个用户. * 建表原则: * 在多的一方创建 ...

  5. 七牛云存储Python SDK使用教程 - 上传策略详解

    本教程旨在介绍如何使用七牛的Python SDK来快速地进行文件上传,下载,处理,管理等工作. 前言 我们在上面的两节中了解到,客户端上传文件时,需要从业务服务器申请一个上传凭证(Upload Tok ...

  6. hibernate教程--持久化类状态详解

    一. Hibernate的持久化类状态: 1.1 Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态 ...

  7. 1.6 动态数据抓取 -- PyQuery详解

    1.6 转载于:https://www.cnblogs.com/Jermy/articles/10940745.html

  8. JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题

    Hibernate的检索方式  Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经加载的对象导航到其他对象. OID检索方式:按照对象的OID来检索对象. HQL检索方式: ...

  9. Hibernate抓取策略

    为什么80%的码农都做不了架构师?>>>    6.抓取策略:抓取策略主要是指获取连接对象的策略. 6.1.基于XML的抓取 1.1.基于XML抓取many-to-one sessi ...

最新文章

  1. 兼容ie跟谷歌上传文件
  2. 通信电子线路期末复习第三章正弦波振荡器
  3. Hadoop-Flume-类比吸尘器图解
  4. 领域驱动设计在马蜂窝优惠中心重构中的实践
  5. PostgreSQL 函数调试、诊断、优化 auto_explain
  6. python创建sqlite3数据库_树莓派使用 Python + SQLite 建立温度数据库
  7. php 密码过滤,PHP实践教程之过滤、验证、转义与密码详解
  8. Vue 作者尤雨溪:以匠人的态度不断打磨完善 Vue
  9. 【译】ASP.NET MVC 5 教程 - 4:添加模型
  10. java 快速排序流程图_java简单快速排序实例解析
  11. Ubuntu18.04版本安装ssh及连接ssh的常见问题
  12. java数据类型简介
  13. Factory模式(工厂模式)
  14. mybatis sql 改写
  15. Oracle EBS财务模块(三)总账功能
  16. linux桌面系统 5种经典的Linux桌面系统
  17. 你的Android手机能投屏到电脑上吗?方法我都给你列出来了
  18. cocos2dx之音效引擎
  19. 华为汽车鸿蒙,华为鸿蒙来了!“碰一碰”就可实现设备互联
  20. AR可视化远程协助,医护诊疗,对讲指挥调度系统方案

热门文章

  1. AB1601低功耗之IIC和PWM控制注意事项
  2. oracle 唯一约束作用,想问下在表上建唯一索引和使用索引+唯一约束,从功能和性能来说有什么差别?...
  3. 数学建模_随机森林分类模型详解Python代码
  4. 2021中青杯数学建模A题 汽车组装车间流水线物料配送问题
  5. Kubernetes CRD开发汇总
  6. buu old-fashion
  7. 【django】配置前端静态文件【6】
  8. 2022-02-21
  9. python with contextmanager yield 语法糖
  10. 2017年CISCN初赛