标签:
配置:<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