配置:<set fetch="join/select/subselect">
Class.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="cn.itcast.hiberate.sh.domain.Classes"> <id name="cid" length="5" type="java.lang.Long"> <generator class="increment"></generator> </id> <property name="cname" length="20" type="java.lang.String"></property> <property name="description" length="100" type="java.lang.String"></property> <!-- set元素对应类中的set集合 通过set元素使classes表与student表建立关联 key是通过外键的形式让两张表建立关联 one-to-many是通过类的形式让两个类建立关联 cascade 级联 save-update 1、当 保存班级的时候,对学生进行怎么样的操作 如果学生对象在数据库中没有对应的值,这个时候会执行save操作 如果学生对象在数据库中有对应的值,这个时候会执行update操作 delete all inverse 维护关系 true 不维护关系 false 维护关系 default false --> <set name="students" cascade="save-update" inverse="true" lazy="false" fetch="join"> <!-- key是用来描述外键 --> <key> <column name="cid"></column> </key> <one-to-many class="cn.itcast.hiberate.sh.domain.Student"/> </set> </class> </hibernate-mapping>
package cn.itcast.hibernate.sh.test;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import org.junit.Test;
import cn.itcast.hiberate.sh.domain.Classes;
import cn.itcast.hiberate.sh.domain.Student;
import cn.itcast.hibernate.sh.utils.HiberanteUtils;
public class FetchTest extends HiberanteUtils{
static{
url = "hibernate.cfg.xml";
}
/**
* n+1的问题
* ------------------------------------
* n:4个班级,班级表中,表的记录数
* 1:查询班级
* 查询班级1条 + 每个班级查询一条学生(4条) = 5条
* ------------------------------------
* select:5条
* subselect:2条。如果需要分析翻译成sql语句存在子查询,这个时候用该策略效率最高
* ------------------------------------
* 针对这种问题:采用抓去策略解决
* 抓取策略:通过一个对象查询关联对象
* 解决问题的方案:子查询 fetch="subselect"
*/
@Test
public void testAll_Classes(){
Session session = sessionFactory.openSession();
List<Classes> cList = session.createQuery("from Classes").list();
for(Classes classes:cList){
Set<Student> students = classes.getStudents();
for(Student student:students){
System.out.println(student.getSname());
}
}
session.close();
}
/**
* n+1的问题
* 解决问题的方案:子查询 fetch="subselect"
*/
@Test
public void testClasses_Some(){
Session session = sessionFactory.openSession();
List<Classes> cList = session.createQuery("from Classes where cid in(1,2,3)").list();
for(Classes classes:cList){
Set<Student> students = classes.getStudents();
for(Student student:students){
System.out.println(student.getSname());
}
}
session.close();
}
/**
* 先查询班级,再查询学生
* -----------------------------
* subselect:2条
* join:1条
*/
@Test
public void testQueryClasses_Id(){
Session session = sessionFactory.openSession();
Classes classes = (Classes)session.get(Classes.class, 1L);
Set<Student> students = classes.getStudents();
for(Student student:students){
System.out.println(student.getSname());
}
session.close();
}
}
原文:http://my.oschina.net/ilaoda/blog/504036