你在做查询的时候它可以帮你关联出它的一些相应的关联对象。那么它关联这个对象的时候是在什么时候发送的这些语句以及它是如何把这些数据拿出来的?

知道延迟检索是怎么回事了,而且它也能够产生这个代理对象。当你用这个代理对象的某个属性的时候它才会初始化。那么代理对象由谁来生成呢?由E:\北风网\hibernate_day03\WebRoot\WEB-INF\lib\javassist-3.12.0.GA.jar这个jar包来生成。

关联级别的检索策略:

package cn.itcast.test;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itcast.utils.HibernateUtils;
import cn.itcast.vo.Customer;
import cn.itcast.vo.Order;
/**
* Hibernate的抓取策略
* @author zhongzh
*
*/
public class HibernateDemo2 {
@Test
/*
* 在<set>集合上配置
* * fetch="subselect" lazy="true"
* * 使用subselect的时候 需要使用query接口进行测试.
* * 如果查询一个客户 查询多个客户.
* 如果有多个客户:
* * select * from orders where cno in (1,2,3);
* 如果只有一个客户:
* * select * from orders where cno = 1;
*/
public void demo7(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); List<Customer> list = session.createQuery("from Customer").list(); for (Customer customer : list) {
System.out.println(customer.getOrders().size());
} tx.commit();
session.close(); }
@Test
/*
* 在<set>集合上配置
* * fetch="select" lazy="extra"
* * lazy:extra:极其懒惰.要订单的数量
*/
public void demo6(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = (Customer) session.get(Customer.class, 1);
// select count(*) from orders where cno = ?;
System.out.println(customer.getOrders().size());
//发送查询订单的SQL.
for (Order order : customer.getOrders()) {
System.out.println(order);//使用订单的是时候它才会发送查询订单的SQL.
} tx.commit();
session.close(); }
@Test
/*
* 在<set>集合上配置
* * fetch="select" lazy="false"
* * lazy:false:关联对象的检索不使用延迟
*/
public void demo5(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 发送多条SQL,查询关联对象.
Customer customer = (Customer) session.get(Customer.class, 1);
// 使用订单的时候又发送一条查询这个客户的订单的SQL
System.out.println(customer.getOrders().size()); tx.commit();
session.close(); }
@Test
/*
* 在<set>集合上配置
* * fetch="select" lazy="true"
* * lazy:true-使用延迟检索
* * 发送多条SQL,查询关联对象
*/
public void demo4(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 发送一条只查询客户的SQL
Customer customer = (Customer) session.get(Customer.class, 1);
// 使用订单的时候又发送一条查询这个客户的订单的SQL
System.out.println(customer.getOrders().size()); tx.commit();
session.close(); }
@Test
/*
*
* <set>配置fetch="join" lazy就会被忽略!!!!
* * 发送迫切左外连接查询两个表.
*/
public void demo3(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//直接发送一条迫切左外连接。其实迫切左外连接和左外连接的SQL语句是一样的.只不过封装的对象不一样.
//迫切左外连接封装到一个对象里.而普通左外连接封装到一个数组里.
//只要一查客户订单就出来了.
/*
* Hibernate:
select
customer0_.cid as cid0_1_,
customer0_.cname as cname0_1_,
orders1_.cno as cno0_3_,
orders1_.oid as oid3_,
orders1_.oid as oid1_0_,
orders1_.addr as addr1_0_,
orders1_.cno as cno1_0_
from
Customer customer0_
left outer join
orders orders1_
on customer0_.cid=orders1_.cno
where
customer0_.cid=?
*/
Customer customer = (Customer) session.get(Customer.class, 1); System.out.println(customer.getOrders().size()); tx.commit();
session.close(); } @Test
/*
*
* <set>没有配置fetch 和 lazy情况
*
*/
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class,1);// 发送查询客户的SQL.
//System.out.println(customer.getCname()); System.out.println(customer.getOrders().size());// 使用了客户的订单的时候,才会发送查询订单的SQL. 又发送一条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);*/
//延迟检索:
// 持久化类如果设置为final 延迟检索就失效了.因为不能生成代理对象
// 在Customer.hbm.xml中在<class>标签上配置lazy="false"不支持延迟检索,就会立即检索.
Customer customer = (Customer) session.load(Customer.class, 1);//这是类级别的检索
//System.out.println(customer);//如果这一行注释的话根本就不会发送SQL语句,你执行完了它也不会发送,因为你根本没有
//用到它里面的属性。
//初始化代理对象 发送SQL语句 产生代理对象 那肯定就能拿出来了
//System.out.println(customer.getCname()); //还可以这样来初始化代理对象
Hibernate.initialize(customer);//当你初始化的时候它才会发送SQL语句
tx.commit();
session.close(); } }
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.vo"><!-- 如果这里配置了包名下面可以不用写 -->
<!--
<hibernate-mapping>
-->
<!--
<class name="cn.itcast.hibernate3.demo2.Customer" table="customer">
-->
<!--
<class name="cn.itcast.vo.Customer">
-->
<class name="Customer" lazy="true">
<!-- 配置唯一标识 -->
<id name="cid" column="cid">
<generator class="native"/>
</id>
<!-- 配置普通属性 -->
<property name="cname" column="cname" length="20"/> <!-- 建立映射 -->
<!-- 配置一个集合 <set>的name Customer对象中的关联对象的属性名称. -->
<!-- 这里把级联去掉 要最简短的配置
<set name="orders" cascade="save-update" inverse="true">
-->
<set name="orders" cascade="save-update" fetch="subselect" lazy="true">
<!-- <key>标签中column:用来描述一对多多的一方的外键的名称. -->
<key column="cno"></key>
<!-- 配置一个<one-to-many>标签中class属性:订单的类的全路径 -->
<!--
<one-to-many class="cn.itcast.hibernate3.demo2.Order"/>
-->
<one-to-many class="cn.itcast.vo.Order"/>
</set>
</class>
<!-- 命名查询的方式 -->
<query name="findAll">
from Customer
</query>
<!-- 这里要写sql语句
<sql-query> </sql-query>
-->
</hibernate-mapping>
package cn.itcast.vo;

import java.util.HashSet;
import java.util.Set; /**
* 客户的实体:
* @author 姜涛
*
*/
public class Customer {
private Integer cid;
private String cname; public Customer() {//无参构造函数
super();
// TODO Auto-generated constructor stub
} public Customer(String cname) {//有参构造
super();
this.cname = cname;
} // 一个客户有多个订单.
private Set<Order> orders = new HashSet<Order>();
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
//@Override
public String toString() {//客户这里打印也打印出订单的集合。这是死循环了,所以这里应该去掉一方的打印。
/* return "Customer [cid=" + cid + ", cname=" + cname + ", orders="
+ orders + "]";*/
return "Customer [cid=" + cid + ", cname=" + cname + "]";//客户这里去掉订单集合的打印 }
//测试迫切内连接的封装效果。重写toString()方法
/* @Override
public String toString() {
return "Customer [cid=" + cid + ", cname=" + cname + ", orders="
+ orders + "]";
}*/
}
package cn.itcast.vo;
/**
* 订单的实体:
* @author 姜涛
*
*/
public class Order {
private Integer oid;
private String addr;
// 订单属于某一个客户.放置一个客户的对象.
private Customer customer;
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
//@Override
public String toString() {//订单这边又打印客户了。这是死循环了,所以这里应该去掉一方的打印。
return "Order [oid=" + oid + ", addr=" + addr + ", customer="
+ customer + "]";
}
//测试迫切内连接的封装效果。重写toString()方法
/* @Override
public String toString() {//两边不能同时打印,不然容易出问题
return "Order [oid=" + oid + ", addr=" + addr + "]";
}*/ }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
<class name="cn.itcast.hibernate3.demo2.Order" table="orders">
-->
<class name="cn.itcast.vo.Order" table="orders">
<!-- 配置唯一标识 -->
<id name="oid" column="oid">
<generator class="native"/>
</id>
<!-- 配置普通属性 -->
<property name="addr" column="addr" length="50"/>
<!-- 配置映射 -->
<!--
<many-to-one>标签
name :关联对象的属性的名称.
column :表中的外键名称.
class :关联对象类的全路径
-->
<!--
<many-to-one name="customer" column="cno" class="cn.itcast.hibernate3.demo2.Customer"/>
-->
<many-to-one name="customer" column="cno" class="cn.itcast.vo.Customer"/>
</class>
</hibernate-mapping>

day36 06-Hibernate抓取策略:set集合上的抓取策略的更多相关文章

  1. day36 07-Hibernate抓取策略:many-to-one上的抓取策略

    package cn.itcast.test; import java.util.List; import org.hibernate.Hibernate; import org.hibernate. ...

  2. Hibernate 一对多,多对多,多对一检索策略

    一.概述 我们先来谈谈检索数据时的两个问题: 1.不浪费内存   2.更好的检索效率 以上说的问题都是我们想要避免的,接下来就引出了我们要讨论的话题---------------hibernate检索 ...

  3. IEEE802.11数据帧在Linux上的抓取

    IEEE802.11数据帧在Linux上的抓取终于得到了梦寐的<802.11无线网络权威指南>,虽然是复印版本,看起来也一样舒服,光看书是不行的,关键还是自己练习,这就需要搭建一个舒服的实 ...

  4. IEEE802.11数据帧在Linux上的抓取 80211格式转8023帧格式

    转:http://blog.csdn.net/dog250/article/details/7749372 终于得到了梦寐的<802.11无线网络权威指南>,虽然是复印版本,看起来也一样舒 ...

  5. Java面试题10(如何取到set集合的第一个元素)

    1.如何取到set集合的第一个元素. public static void main(String[] args) { Set set = new HashSet(); set.add("x ...

  6. 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

    转自:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_ ...

  7. List 集合中 均匀的取七个点 的值

    场景: 一个未知 长度的 List 集合,可能 长度为7,10,50,100, 等等 这个时候 ,我们需要在 集合中 均匀的取七个点: 思路: n=6; int size = list.Size(); ...

  8. Node.js 抓取电影天堂新上电影节目单及ftp链接

    代码地址如下:http://www.demodashi.com/demo/12368.html 1 概述 本实例主要使用Node.js去抓取电影的节目单,方便大家使用下载. 2 node packag ...

  9. 用python来抓取“煎蛋网”上面的美女图片,尺度很大哦!哈哈

    所用Python环境为:python 3.3.2   用到的库为:urllib.request    re 废话不多说,先上代码: import urllib.request import re #获 ...

随机推荐

  1. filebeat+redis+logstash+elasticsearch+kibana搭建日志分析系统

    filebeat+redis+elk搭建日志分析系统 官网下载地址:https://www.elastic.co/downloads 1.下载安装filebeat wget https://artif ...

  2. php中Sessions

    PHP Sessions  Session 中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息. PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会 ...

  3. 关于群晖的sata扩展卡选择

  4. 11-3-while

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Activiti 变量设置

    使用工作流的时候必定会附上一些变量.例如,请假的时候有填写请假理由,天数等等.可以用以下代码实现 public void setVariables(){ /**与任务(正在执行)*/ TaskServ ...

  6. linux支持大容量硬盘

    1.fdisk使用msdos格式分区,最大支持2T硬盘,要使用大于2T硬盘需使用parted命令使用GPT格式分区. 2.除修改分区格式外,linux内核需添加GPT分区格式支持,修改如下: CONF ...

  7. DVWA 之medium级别sql注入

    中级注入的提交方式从get请求改为post请求,可以用burp抓包注入或抓注入点 1 .  判断是否有注入 sqlmap -u "http://192.168.242.1/dvw/vulne ...

  8. Python爬虫笔记【一】模拟用户访问之webdriver用户登入——第三次(8)

    经过post方法之后,因为有动态的value值所以再此回到用webdriver的解决上,但是在下载图片上会打开新打开一个链接,导致与网页图片不同即验证码同步问题,没办法只能想了一个笨法子,网页截图,唉 ...

  9. Java爬虫的实现

    距离上一次写爬虫还是几年前了,那时候一直使用的是httpclient. 由于最近的项目又需要使用到爬虫,因此又重新查询了一些爬虫相关的框架,其中最合适的是WebMagic 官方文档:https://g ...

  10. Linux时间设置命令

    1.date: 语法格式:date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=dates ...