Hibernate -- lazy加载

hibernate类级别懒加载:

lazy:true(默认)

//类级别懒加载
//load方法
//class lazy属性
//默认值:true load获得时,会返回代理对象,不查询数据库,使用时才查询
public void fun1() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Customer load = (Customer) session.load(Customer.class, 17);
System.out.println("----------------sql语句未发送");
System.out.println(load.getName());
//--------------------------------------
session.getTransaction().commit();
session.close();
}

lazy :false

//类级别懒加载
//load方法
//class lazy属性
//默认值:false load方法执行就会发送sql语句,和get方法一致
public void fun2() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Customer load = (Customer) session.load(Customer.class, 19);
System.out.println("----------------sql语句发送");
System.out.println(load.getName());
//--------------------------------------
session.getTransaction().commit();
session.close();
}

hibernate (一对多)加载策略

关联级别懒加载的配置以及查询方式:

lazy:false

  //关联级别懒加载
//lazy:false
public void fun2() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Customer load = (Customer) session.get(Customer.class, 19); System.out.println("所有的--------sql语句发送");
for (Order o : load.getOrders()) {
System.out.println(o.getName());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}


fetch:

fetch:join  / lazy:false  立刻使用select语句加载集合数据
fetch:join  / lazy:true  立刻使用select语句加载集合数据
fetch:join  / lazy:extra  立刻使用select语句加载集合数据

两种相同:会立刻加载出集合数据

fetch:join  / lazy:ture  查询集合时使用表连接查询,会立刻加载出集合数据 //关联级别懒加载
//lazy:false
//fetch :join
public void fun3() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Customer load = (Customer) session.get(Customer.class, 19); System.out.println("左外连接查询--------sql语句发送");
for (Order o : load.getOrders()) {
System.out.println(o.getName());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}

select:(默认)表连接语句查询集合数据  lazy:false

fetch:subselect  / lazy:false  立刻使用select语句加载集合数据

一次加载多个customer的订单数据

    //关联级别懒加载
//lazy:false
//fetch :subselect
public void fun4() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
List<Customer> list = session.createQuery("from com.huhu.domain.Customer").list();
for (Customer c : list) {
System.out.println(c.getName() + c.getOrders().size());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}

fetch:subselect  / lazy:true  立刻使用select语句加载集合数据
    //关联级别懒加载
//lazy:true
//fetch :subselect
public void fun5() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
List<Customer> list = session.createQuery("from com.huhu.domain.Customer").list();
System.out.println("使用order时才去数据库查询");
for (Customer c : list) {
System.out.println(c.getName() + c.getOrders().size());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}



fetch:select  / lazy:true (默认)普通的查询语句
//关联级别懒加载
//lazy:true
//fetch :select
public void fun6() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
System.out.println("customer--------sql语句发送");
Customer load = (Customer) session.get(Customer.class, 17); System.out.println("order--------sql语句发送");
for (Order o : load.getOrders()) {
System.out.println(o.getName());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}

fetch:select  / lazy:false  立刻使用select语句加载集合数据
 //关联级别懒加载
//lazy:false
//fetch :select
public void fun7() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Customer load = (Customer) session.get(Customer.class, 17); System.out.println("所有的--------sql语句发送");
for (Order o : load.getOrders()) {
System.out.println(o.getName());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}

关联级别懒加载:

由两个属性控制,在关联属性<set>中的两个属性:lazy和fecth,他们的对应值分别为 true,false,extra/select,subselect,join,这样一共有9中方法。仔细看看关于extra。

true/select:(默认值)会在使用集合是加载,普通的select语句

true/subselect:会在使用集合时加载,子查询语句,是延迟加载

true/join和false/join和extra/join:查询时使用表链接查询,会立刻加载集合数据,都没有延时加载

false/select:立刻使用select语句加载集合数据

false/subselect:会在查询customer时,  立即使用子查询加载客户的订单数据

extra:特别懒惰,如果时用集合时,之调用size()方法查询数量时,Hibernate发送count语句,只查询数量,不查询集合内数据
        extra/select
 //关联级别懒加载
//lazy:extra
//fetch :select
public void fun8() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Customer load = (Customer) session.get(Customer.class, 17); System.out.println("-------查询数量count()------");
System.out.println(load.getOrders().size());
System.out.println("----------查询customer--------");
for (Order o : load.getOrders()) {
System.out.println(o.getName());
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}

extra/subselect

//关联级别懒加载
//lazy:extra
//fetch :subselect
public void fun9() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
List<Customer> list = session.createQuery("from com.huhu.domain.Customer").list();
for (Customer c : list) {
System.out.println(c.getName() + "------------" + c.getOrders().size());
}
for (Customer cs : list) {
for (Order o : cs.getOrders()) {
System.out.println(cs.getName() + "------------" + o.getName());
}
}
//--------------------------------------
session.getTransaction().commit();
session.close();
}

hibernate:加载策略多对一

多对一:
lazy
  false 加载订单时,会立即加载客户
  proxy 看客户对象的类加载策略来决定
  no-proxy : 不做研究. 
  fetch=
select  : (默认值)使用普通select加载

join : 使用表链接加载数据

测试:

package com.huhu.b_lazy;

import com.huhu.domain.Customer;
import com.huhu.domain.Order;
import com.huhu.utils.HibernateUtils;
import org.hibernate.Session; import java.util.List; /**
* 加载策略:多对一
*/
public class HibernateDemo3 { //fetch:select
//lazy:false
//默认:与我关联的数据时,在使用时才会加载。
public void fun1() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Order order = (Order) session.get(Order.class, 17);
System.out.println(order.getCustomer().getName());
//--------------------------------------
session.getTransaction().commit();
session.close();
} //fetch:select
//lazy:proxy
//Customer类加载策略:lazy :false
//默认:与我关联的数据时,在使用时才会加载。
public void fun2() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Order order = (Order) session.get(Order.class, 17); //--------------------------------------
session.getTransaction().commit();
session.close();
} //fetch:select
//lazy:proxy
//Customer类加载策略:lazy :true
//默认:与我关联的数据时,在使用时才会加载。
public void fun3() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Order order = (Order) session.get(Order.class, 19);
System.out.println(order.getCustomer().getName());
//--------------------------------------
session.getTransaction().commit();
session.close();
} //fetch:join
//lazy:proxy|false
//Customer类加载策略:lazy :true
//默认:与我关联的数据时,在使用时才会加载。
public void fun4() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
//--------------------------------------
Order order = (Order) session.get(Order.class, 19);
//--------------------------------------
session.getTransaction().commit();
session.close();
} public static void main(String[] args) {
HibernateDemo3 d = new HibernateDemo3();
d.fun4();
}
}

如果想看代码得话可以复制以上代码测试。

Hibernate -- lazy加载的更多相关文章

  1. hibernate懒加载(转载)

    http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...

  2. Hibernate懒加载的三种解决方案

    Hibernate懒加载的两种解决方案: 1.Hibernate.initialize(代理对象) 2.在*.hbm.xml映射文件中添加lazy="false"属性 3.使用op ...

  3. Hibernate懒加载解析

    Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...

  4. hibernate懒加载

    Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...

  5. 【转】hibernate懒加载的问题,failed to lazily initialize a collection of role

    hibernate懒加载的问题,failed to lazily initialize a collection of role hibernate懒加载的问题,failed to lazily in ...

  6. Hibernate懒加载深入分析

    Hibernate懒加载深入分析 懒加载可以提高性能吗?  不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...

  7. -java转json hibernate懒加载造成的无限递归问题

    1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...

  8. Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)

    1. 异常: [console_demo][WARN] [2016-12-15 19:49:35] org.springframework.web.servlet.mvc.support.Defaul ...

  9. 关于s2sh框架关于hibernate懒加载问题的说明和解决方案

    首先我们来看下面这个图,解释了一个web程序的一次请求流程! 懒加载异常的说明: 懒加载就是我们在查询一个对象时,它所有的属性是否要被查出来! 如果懒加载开启的话,session在service层就被 ...

随机推荐

  1. Python dict 将元祖转成字典

    dict 关键字 dict3=dict(((),(),())) #dict 只有一个参数 输出:{'a': 97, 'b': 98, 'c': 99}

  2. C++通过jsoncpp类库读写JSON文件-json用法详解

    介绍: JSON 是常用的数据的一种格式,各个语言或多或少都会用的JSON格式. JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择. ...

  3. Newtonsoft.Json 去掉\r\n

    itemKindList.ToString(Newtonsoft.Json.Formatting.None)

  4. 【BZOJ】1052: [HAOI2007]覆盖问题

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1052 大概自己YY了个贪心然后过了... 二分答案,考虑如何check: 找到一个最小的矩 ...

  5. python的json模块的dumps,loads,dump,load方法介绍

    dumps和loads方法都在内存中转换, dump和load的方法会多一个步骤,dump是把序列化后的字符串写到一个文件中,而load是从一个文件中读取字符串 将列表转为字符串 >>&g ...

  6. Ubuntu 下 Python自由切换

    sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternati ...

  7. java反编译器

    一时手残,把java工程中的源文件给删了,幸亏还有.class文件,想起java可以反编译,所以试一试. JD-Eclipse 如果是使用Eclipse的话,可以用Eclipse插件JadClipse ...

  8. List<String> list=new ArrayList<String>(20);为什么要声明为List 而不是ArrayList<String>?

    如何理解:List<String> list=new ArrayList<String>();为甚麼要声明为List 而不是ArrayList<String>? 在 ...

  9. arcgis10.3 python2.7 开发环境配置

    如题: 首先安装arcgis desktop 和 自带的python版本,本楼的是2.7.8,安装地址在E:\PYTHON2.7,安装完成后即可开始安装pythonwin2.7,下载地址为:http: ...

  10. js几个小技巧和坑

    蝴蝶书看了,也知道充满了毒瘤和糟粕,但该用还是得用. 实际写了几天,小技巧记录下来.都是在py里有直接答案,不会遇到的问题,没想到js里这么费事. 还是要多读<ES6标准入门> 1判断ob ...