hibernate教程--抓取策略详解
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教程--抓取策略详解相关推荐
- hibernate教程--抓取策略
Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...
- python爬虫beautifulsoup爬当当网_Python爬虫包 BeautifulSoup 递归抓取实例详解_python_脚本之家...
Python爬虫包 BeautifulSoup 递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到 ...
- Python爬虫包 BeautifulSoup 递归抓取实例详解
Python爬虫包 BeautifulSoup 递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另 ...
- hibernate教程--关联关系的映射详解
1.1 Hibernate关联关系的映射 1.1.1 实体之间的关系: 实体之间有三种关系: * 一对多: * 一个用户,生成多个订单,每一个订单只能属于一个用户. * 建表原则: * 在多的一方创建 ...
- 七牛云存储Python SDK使用教程 - 上传策略详解
本教程旨在介绍如何使用七牛的Python SDK来快速地进行文件上传,下载,处理,管理等工作. 前言 我们在上面的两节中了解到,客户端上传文件时,需要从业务服务器申请一个上传凭证(Upload Tok ...
- hibernate教程--持久化类状态详解
一. Hibernate的持久化类状态: 1.1 Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态 ...
- 1.6 动态数据抓取 -- PyQuery详解
1.6 转载于:https://www.cnblogs.com/Jermy/articles/10940745.html
- JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题
Hibernate的检索方式 Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经加载的对象导航到其他对象. OID检索方式:按照对象的OID来检索对象. HQL检索方式: ...
- Hibernate抓取策略
为什么80%的码农都做不了架构师?>>> 6.抓取策略:抓取策略主要是指获取连接对象的策略. 6.1.基于XML的抓取 1.1.基于XML抓取many-to-one sessi ...
最新文章
- 兼容ie跟谷歌上传文件
- 通信电子线路期末复习第三章正弦波振荡器
- Hadoop-Flume-类比吸尘器图解
- 领域驱动设计在马蜂窝优惠中心重构中的实践
- PostgreSQL 函数调试、诊断、优化 auto_explain
- python创建sqlite3数据库_树莓派使用 Python + SQLite 建立温度数据库
- php 密码过滤,PHP实践教程之过滤、验证、转义与密码详解
- Vue 作者尤雨溪:以匠人的态度不断打磨完善 Vue
- 【译】ASP.NET MVC 5 教程 - 4:添加模型
- java 快速排序流程图_java简单快速排序实例解析
- Ubuntu18.04版本安装ssh及连接ssh的常见问题
- java数据类型简介
- Factory模式(工厂模式)
- mybatis sql 改写
- Oracle EBS财务模块(三)总账功能
- linux桌面系统 5种经典的Linux桌面系统
- 你的Android手机能投屏到电脑上吗?方法我都给你列出来了
- cocos2dx之音效引擎
- 华为汽车鸿蒙,华为鸿蒙来了!“碰一碰”就可实现设备互联
- AR可视化远程协助,医护诊疗,对讲指挥调度系统方案