Hibernate加载策略
原创
©著作权归作者所有:来自51CTO博客作者请你打开电视看看的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 类级别的加载策略
- 关联级别的加载策略
- 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();

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>
