码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate(四)

时间:2015-09-09 23:01:36      阅读:408      评论:0      收藏:0      [点我收藏+]

标签:

1. 抓取策略


  • 抓取策略:怎样发出sql语句
  • 懒加载:什么时候发出sql语句

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



FetchTest.java



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();
	}
}





Hibernate(四)

标签:

原文地址:http://my.oschina.net/ilaoda/blog/504036

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!