类级别的加载策略
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返回的是一个集合
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>