检索方式
检索概念与检索配置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();
}

单表立即加载使用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)关联表多对一的立即检索
第一步:修改配置

第二步:核心代码
查询后关闭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)关联表一对多的延迟检索:
第一步:确认配置

默认是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)关联表一对多的立即检索:
第一步:修改配置

第二步:核心代码保持不变
@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());
}
}
网友评论