[color=black][b]1 hibernate抓取策略(单端代理的批量抓取)[/b][/color]
[b]保持默认,同fetch="select",如:[/b]
<many-to-one name="classes" column="classesid" fetch="select"/>
fetch="select",另外发送一条select语句抓取当前对象关联实体或集合
[b]设置fetch="join",如:[/b]
<many-to-one name="classes" column="classesid" fetch="join"/>
fetch="join",hibernate会通过select语句使用左外连接来加载其关联实体或集合
此时lazy会失效
[color=black][b]2 hibernate抓取策略(集合代理的批量抓取)[/b][/color]
[b]保持默认,同fetch="select",如:[/b]
<set name="students" inverse="true" cascade="all" fetch="select">
fetch="select",另外发送一条select语句抓取当前对象关联实体或集合
[b]设置fetch="join",如:
[/b]<set name="students" inverse="true" cascade="all" fetch="join">
fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合
此时lazy会失效
[b]设置fetch="subselect",如:[/b]
<set name="students" inverse="true" cascade="all" fetch="subselect">
fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合
[b][color=black]HQL 支持LAZY,但是不支持映射文件中的fetch,即使设置fetch="join",也不会采用join。只有在hql中显示利用fetch才能利用,如:
select s from Student s join fetch s.classes c
[/color][/b]
[b]保持默认,同fetch="select",如:[/b]
<many-to-one name="classes" column="classesid" fetch="select"/>
fetch="select",另外发送一条select语句抓取当前对象关联实体或集合
[b]设置fetch="join",如:[/b]
<many-to-one name="classes" column="classesid" fetch="join"/>
fetch="join",hibernate会通过select语句使用左外连接来加载其关联实体或集合
此时lazy会失效
[color=black][b]2 hibernate抓取策略(集合代理的批量抓取)[/b][/color]
[b]保持默认,同fetch="select",如:[/b]
<set name="students" inverse="true" cascade="all" fetch="select">
fetch="select",另外发送一条select语句抓取当前对象关联实体或集合
[b]设置fetch="join",如:
[/b]<set name="students" inverse="true" cascade="all" fetch="join">
fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合
此时lazy会失效
[b]设置fetch="subselect",如:[/b]
<set name="students" inverse="true" cascade="all" fetch="subselect">
fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合
/**
* Hibernate: select students0_.classesid as classesid1_, students0_.id as id1_,
* students0_.id as id1_0_, students0_.name as name1_0_,
* students0_.classesid as classesid1_0_
* from t_student students0_
* where students0_.classesid in (select classes0_.id from t_classes classes0_ where classes0_.id in (1 , 2 , 3))
*/
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List classesList = session.createQuery("select c from Classes c where c.id in(1, 2, 3)").list();
for (Iterator iter=classesList.iterator(); iter.hasNext();) {
Classes classes = (Classes)iter.next();
System.out.println("classes.name=" + classes.getName());
for (Iterator iter1=classes.getStudents().iterator(); iter1.hasNext();) {
Student student = (Student)iter1.next();
System.out.println("student.name=" + student.getName());
}
}
[b][color=black]HQL 支持LAZY,但是不支持映射文件中的fetch,即使设置fetch="join",也不会采用join。只有在hql中显示利用fetch才能利用,如:
select s from Student s join fetch s.classes c
[/color][/b]