立即检索:
get()
当执行某行代码的时候,马上发出sql语句进行查询
延迟检索:
load()
当执行某行代码的时候,不会马上发出sql语句进行查询,当真正使用这个对象的时候才会发送sql语句
实例代码:
@Test
public void test1(){
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
//立即检索
// Studentstudent = (Student) session.get(Student.class, 1);
// System.out.println(student);
/*
* 延迟加载
* 持久化类如果设置了final 延迟加载立即失效
* 在Student.hbm.xml 文件的class里面设置lazy="false"不支持延迟加载
*/
Student student = (Student) session.load(Student.class, 1);
System.out.println(student);
tx.commit();
session.close();
}
类级别检索和关联级别检索
类级别检索:
<class>标签上配置lazy
关联级别检索:
<set>/<many-to-one>上面的配置lazy
从一的一方关联多的一方
<set>
fetch:控制sql语句的类型
join:发送迫切左外连接的sql查询关联对象 如果在配置文件中配置了fetch=”join” 那么后面配置了lazy将被忽略
select:默认值,发送多条sql查询关联对象
subselect:发送子查询关联对象(需要用Query接口测试)
lazy:控制关联对象的检索是否采用延迟
true:默认值,查询关联对象的时候使用延迟检索
false:查询关联对象的时候不适用延迟检索
extra:及其懒惰
/*
* fetch="subselect"lazy="true" 如果lazy参数为false那么就不延迟 如果参数为extra那么就发送count()
*
* 一个:
* select from Orders where cno = (1)
* 多个: select from Orders where cno in (1,2,3)
*
*/
@Test
public void test7(){
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
@SuppressWarnings("unchecked")
List<Student> list = session.createQuery("from Student").list();
for(Student student : list) {
System.out.println(student.getOrders().size());
}
tx.commit();
session.close();
}
// 在配置文件中配置了fetch="join"发送一个迫切左外连接sql语句
@Test
public void test2(){
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
//发送查询客户的sql语句
Student student = (Student) session.get(Student.class, 1);
//当使用客户订单的时候,才会发送查询订单的sql
System.out.println(student.getOrders().size());
tx.commit();
session.close();
}
* 延迟加载
* 持久化类如果设置了final 延迟加载立即失效
* 在Student.hbm.xml 文件的class里面设置lazy="false"不支持延迟加载
*/
Student student = (Student) session.load(Student.class, 1);
System.out.println(student);
tx.commit();
session.close();
}