文章目录

  • ​​类级别的加载策略​​
  • ​​关联级别的加载策略​​
  • ​​fecth​​
  • ​​select:默认的 普通的select查询语句​​
  • ​​join:表连接查询语句​​
  • ​​subselect:使用子查询​​
  • ​​多对一加载策略​​
  • ​​批量加载​​

类级别的加载策略

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();

Hibernate加载策略_懒加载


load懒加载

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

Hibernate加载策略_hibernate_02


再Student.hbm.xml中的class中配置lazy=“false”,load方法也会及时加载

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

Hibernate加载策略_懒加载_03

关联级别的加载策略

默认为懒加载

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();

Hibernate加载策略_System_04

可以在配置表对应关系时设置为及时加载
添加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>

Hibernate加载策略_加载_05

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>

Hibernate加载策略_System_06

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();

Hibernate加载策略_加载_07

多对一加载策略

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

多对一set集合
lazy:

  • “false” 表示类加载时 set集合也加载
  • “proxy” 即代理 根据类级别的加载策略决定
  • “no-proxy” 很少用
    subselect不能用在多对一 subselect返回的是一个集合

class

set lazy

set fetch

注释

false

proxy

join

Order和Customer都是即时加载 join语句

false

proxy

select

Order及时加载 Customer懒加载

true

proxy

join

Order懒加载 Customer即时加载

true

proxy

select

Order懒加载 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>

Hibernate加载策略_System_08