Hibernate加载策略

类级别的加载策略

get:立即检索 get方法一执行,立即查询所有字段的数据
load:延迟检索。默认情况下 load方法执行后 如果只使用OID的值不进行查询,如果要使用其他属性值才查询
get及时加载

Session session = HibernateUtils.openSession();
Student student = (Student)session.get(Student.class, 1);
System.out.println(".......................");
System.out.println(student.getName());
session.close();

在这里插入图片描述
load懒加载

Session session = HibernateUtils.openSession();
Student student = (Student)session.load(Student.class, 1);
System.out.println(".......................");
System.out.println(student.getName());
session.close();

在这里插入图片描述
再Student.hbm.xml中的class中配置lazy=“false”,load方法也会及时加载

 <class name="Student" table="t_student" lazy="false"></class>

在这里插入图片描述

关联级别的加载策略

默认为懒加载

Session session = HibernateUtils.openSession();
Student student = (Student)session.get(Student.class, 1);
System.out.println(".......................");
Set<Courses> courses = student.getCourses();
for(Courses cs:courses){
    System.out.println(cs.getName());
}
session.close();

在这里插入图片描述

可以在配置表对应关系时设置为及时加载
添加lazy=“false”

<set name="courses" table="t_student_course" cascade="all-delete-orphan" inverse="true" lazy="false">
    <key column="sid"></key>
    <many-to-many class="Courses" column="cid"></many-to-many>
</set>

在这里插入图片描述

fecth

fecth:用来指定查询集合的方式

select:默认的 普通的select查询语句

set集合默认的sql查询方式fectch=select

<set name="courses" table="t_student_course" cascade="all-delete-orphan" inverse="true" fetch="select">
   <key column="sid"></key>
   <many-to-many class="Courses" column="cid"></many-to-many>
</set>

join:表连接查询语句

<set name="courses" table="t_student_course" cascade="all-delete-orphan" inverse="true" fetch="join">
    <key column="sid"></key>
    <many-to-many class="Courses" column="cid"></many-to-many>
</set>

在这里插入图片描述

subselect:使用子查询

只能用于多对多 一对多

Session session = HibernateUtils.openSession();
session.getTransaction().begin();
List<Student> from_student = session.createQuery("from Student").list();
for(Student student:from_student){
    System.out.println(student.getCourses().size());
}
session.getTransaction().commit();
session.close();

在这里插入图片描述

多对一加载策略

<many-to-one name="customer" class="Customer" column="customer_id" fetch="" lazy=""></many-to-one>

多对一set集合
lazy:

  • “false” 表示类加载时 set集合也加载
  • “proxy” 即代理 根据类级别的加载策略决定
  • “no-proxy” 很少用
    subselect不能用在多对一 subselect返回的是一个集合
classset lazyset fetch注释
falseproxyjoinOrder和Customer都是即时加载 join语句
falseproxyselectOrder及时加载 Customer懒加载
trueproxyjoinOrder懒加载 Customer即时加载
trueproxyselectOrder懒加载 Customer懒加载

批量加载

set标签设置一本batch-size=“2”,表示每次可以加载两条数据

<set name="orders" inverse="true" cascade="delete-orphan,save-update,delete" batch-size="2">
<!--            填写Order表中的外键-->
    <key column="customer_id" ></key>
    <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
</set>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值