美文网首页
延迟检索与立即检索

延迟检索与立即检索

作者: 神豪VS勇士赢 | 来源:发表于2018-08-21 19:59 被阅读41次

检索方式
检索概念与检索配置lazy="true"
1.缺省延时装载为lazy=”true”.延迟到真正使用对象非主键属性时才发出sql语句加载对象。会有个代理类POJO_proxy父类; load方法首先查找Session缓存,然后查找二级缓存,若找不到则返回代理对象(get方法在此处查询数据库)。
2.类级别延迟检索与立即检索(单表)
3.关联表的延迟检索与立即检索(多表)

立即检索:立即查询,在执行查询语句时,立即查询所有的数据。
1.get方法一执行,立即查询所有字段的数据。无数据返回null
就是直接查询数据库

延迟检索:延迟查询,在执行查询语句之后,在需要时再查询。(懒加载)
load方法执行后,如果只使用OID的值不进行查询【如果只是主键】,如果要使用其他属性值将查询 。 lazy=“true | false”。
如果没有数据抛异常。
先不会立即发送SQL语句查询数据库,而是使用到非主键属性的时候才发SQL

一:类级别延迟检索与立即检索(单表)

单表延迟加载使用load方式(延迟查)
调用load时没有发出sql语句,真正使用具体属性的时候才发出sql语句查询。

Idea中打印分隔符用运行模式测试

//单表的延迟与立即,只关系主表
public void findByIdLazy(Long typeId){
Session session = HibernateUtils.openSession();
// BookType bookType = session.get(BookType.class, typeId);
BookType bookType = session.load(BookType.class, typeId);
System.out.println(bookType.getTypeName());
session.close();
}

image.png

单表立即加载使用get(查数据库)
调用get方法直接发sql语句查询数据库

public void findByIdLazy(Long typeId){
  Session session = HibernateUtils.openSession();
  BookType bookType = session.get(BookType.class, typeId);//它发送了SQL语句

// BookType bookType = session.load(BookType.class, typeId);//这个时候没有发送SQ语句
System.out.println("=========================================");
System.out.println(bookType.getTypeName());
session.close();
}

可以发现在横线上面就打印输出了 SQL 查询语句

注意:单表的检索方式和lazy属性没有关系。

两种方案的对比,也就是延迟检索和立即检索的对比:

public BookType findByTypeId1(Long id){
Session session = HibernateUtils.openSession();
//这里使用的是单表的延迟检索查询
BookType bookType = session.load(BookType.class, id);
//单表的延迟检索,延迟到使用这个对象属性的时候才发送SQL语句。
session.close();
return bookType;//返回的内容不能使用,因为session关闭了不能发送SQL语句。
}

public BookType findByTypeId2(Long id){
Session session = HibernateUtils.openSession();
//这里使用的是立即检索方案
BookType bookType = session.get(BookType.class, id);//立即检索,就立即发送SQL语句查询
session.close();
return bookType;
}

测试:

public static void main(String[] args) {
BookTypeDAO bookTypeDAO = new BookTypeDAO();
// 这个会失败 no Session
// BookType byTypeId1 = bookTypeDAO.findByTypeId1(39L);
// System.out.println(byTypeId1.getTypeName());//预测是否正常
BookType byTypeId2 = bookTypeDAO.findByTypeId2(39L);
System.out.println(byTypeId2.getTypeName());
}

二:关联表延迟检索与立即检索 (多表)

多对一 仅仅在 多表配置文件中 many-to-one 中加入 lazy="false" 即可

一对多 仅仅在 一表中 set 中加入 lazy="false" 即可

立即检索lazy=false
延迟检索(配置默认的方式)lazy=true

默认使用延迟加载策略,如果不想使用延迟加载策略,可以修改配置lazy="false"
<set name="orders" inverse="true" lazy="false">
<many-to-one column="customer_id" lazy="false"/>
Idea中打印分隔符用运行模式测试(Eclipse中可以调试模式看)

public BookInfo findById(Long bookId){
Session session = HibernateUtils.openSession();
BookInfo bookInfo = session.get(BookInfo.class, bookId);
//主表信息
System.out.println(bookInfo.getBookName());
System.out.println("======================================");
//关联表信息:延迟发送SQL,查询关联表的记录
BookType bookTypeByTypeId = bookInfo.getBookTypeByTypeId();
//输出关联表
System.out.println(bookTypeByTypeId.getTypeName());
session.close();
return bookInfo;
}

注意:这里主表也可以使用session.load(),仅仅标示主表是延迟检索,关联表必须看
lazy属性确认是什么检索方式。

2)关联表多对一的立即检索
第一步:修改配置


image.png

第二步:核心代码
查询后关闭session,返回对象,可以在调用的地方拿到关联表的信息。
必须使用立即检索方式。

@Test
public void testImmediately(){
    Session session = HibernateUtils.getSession();
    BookInfo bookInfo = session.get(BookInfo.class, 8L);

    System.out.println(bookInfo.getBookName()+"\t"+bookInfo.getBookDesc());
    System.out.println("===========================");
    BookType bookTypeByTypeId = bookInfo.getBookTypeByTypeId();
    System.out.println(bookTypeByTypeId.getTypeId()+"\t"+bookTypeByTypeId.getTypeDesc());
}

3)关联表一对多的延迟检索:
第一步:确认配置

image.png

默认是lazy=true

第二步:核心代码
在session关闭之前获取关联表的信息

public BookType findById(Long typeId){
Session session = HibernateUtils.openSession();
BookType bookType = session.get(BookType.class, typeId);
//分类信息
System.out.println(bookType.getTypeName());
System.out.println("======================");
//分类对应的图书
Collection<BookInfo> bookInfosByTypeId = bookType.getBookInfosByTypeId();
for (BookInfo bookInfo : bookInfosByTypeId) {
System.out.println(bookInfo.getBookName());
}

session.close();
return bookType;
}

4)关联表一对多的立即检索:
第一步:修改配置

image.png

第二步:核心代码保持不变

@Test
public  void testImmediately(){
    Session session = HibernateUtils.getSession();
    BookType bookType = session.get(BookType.class, 43L);
    String typeName = bookType.getTypeName();
    System.out.println(typeName);
    System.out.println("============================");
    Collection<BookInfo> bookInfosByTypeId = bookType.getBookInfosByTypeId();
    for (BookInfo bookInfo : bookInfosByTypeId) {
        System.out.println(bookInfo.getBookAuthor());
    }
}

相关文章

  • Hibernate学习笔记 | Hibernate检索策略

    类级别的检索策略 类级别可选的检索策略包括立即检索和延迟检索,默认为延迟检索 立即检索:立即加载检索方法指定的对象...

  • 延迟检索与立即检索

    检索方式检索概念与检索配置lazy="true"1.缺省延时装载为lazy=”true”.延迟到真正使用对象非主键...

  • Hibernate 抓取策略(查询)

    检索方式 立即检索:立即查询,在执行查询语句时,立即查询所有的数据。 延迟检索:延迟查询,在执行查询语句之后,在需...

  • Hibernate框架基础知识

    1. 抓取策略 1.1 类级别检索 当前的类的属性获取是否需要延迟。 get:立即检索。get方法一执行,立即查询...

  • 算法与数据结构-检索(2)

    顺序检索 顺序检索:逐个检查每个数据元素。 顺序检索简单,复杂度与被检索的数据元素个数成正比,因此顺序检索也被称为...

  • Hibernate学习(检索策略)

    检索策略的概念 hibernate检索策略分为两类:(1)立即查询:根据id查询,调用get方法,一调用get方法...

  • Hibernate检索策略

    一 检索策略概念1 hibernate检索策略分为两类(1)立即查询:根据id查询,调用get方法,一调用get方...

  • 检索模型与检索排序

    1. 用户查询与返回结果相关度度量 1.1 相似性计算:空间向量余弦夹角 https://www.jianshu....

  • 【16年一周一专题】——专题二《信息检索策略》

    目录 关于检索 检索策略 搜索内容的途径 修饰检索词 检索式 检索举例 参考文献 关于检索 使用正确的检索工具,是...

  • 人机对话(3)-聊天机器人(检索、生成)

    当前闲聊机器人有两种实现方式:基于检索 与 基于生成 基于检索的chatbot 检索这种方式,在搜索与推荐系统中通...

网友评论

      本文标题:延迟检索与立即检索

      本文链接:https://www.haomeiwen.com/subject/pgbdiftx.html