T05-加载策略课件_第1页
T05-加载策略课件_第2页
T05-加载策略课件_第3页
T05-加载策略课件_第4页
T05-加载策略课件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

T05加载策略2024/4/17T05加载策略课程目标对象在Hibernate中的状态加载策略介绍lazy=”false”与fetch=

“join”的区别inverse=”true”insert=”false”update=”false”T05加载策略对象在Hibernate中的状态临时状态 普通的Java对象,只是一个携带信息的载体 没与session实例关联, 没与数据库中记录关联持久状态 持久实例在数据库中 有对应的记录, 并拥有持久化标识, 持久实例可能是刚刚被保存, 或刚刚被加载的数据脱管状态 持久对象关联的Session关闭后, 对象变为脱管saveOrUpdate()‏临时状态持久状态脱管状态get()‏load()‏find()‏iterator()‏save()‏update()‏delete()‏close()‏clear()‏update()‏evict()‏delete()‏T05加载策略举例说明对象状态Sessionsession=sessionFactory.openSession();//开启连接tx=session.beginTransaction();//开启事务Employeeemp=session.get(Employee.class,123);//根据主键加载emp.setEmpName(“QQ”); //对持久对象进行更改,不需要更新session.update(emp); //更新,此句没有必要mit();session.close();emp.setEmpName(“QQ1”);

//对脱管对象进行更改Sessionsession2=sessionFactory.openSession();//开启连接tx=session2.beginTransaction();//开启事务session2.update(emp);…..T05加载策略pubicclassEmpDAO{publicstaticEmployeegetEmployeeById(Integerid) Sessionsession=sessionFactory.openSession();//开启连接tx=session.beginTransaction();//开启事务Employeeemp=(Employee)session.get(Employee.class,id);//根据主键加载mit();session.close();......忽略了异常处理returnemp;}Employeeemp=EmpDAO.getEmployeeById(10011);//此时emp是什么状态??emp.setEmpName(“AA”);//数据库中empName值是什么?T05加载策略加载策略介绍我们知道,Hiberante是一个ORM工具,它使得我们能够直接去操纵对象而不是数据库中表。Hibernate的数据检索策略也是给予对对象的操作的。数据检索策略主要包括一下几种:立即加载,延迟加载,预先抓取和批量加载。其中前三个是统一级别的,三个当中智能选择其中一个,而批量加载则可以很好的整合前面三个,还有就是预先抓取和批量加载都是为了优化前面两种方式而形成的。同时对于配置文件中的某个属性一旦设为预先抓取,则其它的数据检索方式都对这个属性失效。

下面分别进行讨论:

1立即检索:立即检索的时候需要在配置文件添加属性lazy="false".当Hibernate在从数据库中取得字段值组装好一个对象后,会立即再组装此对象所关联的对象,如果这个对象还有关联对象,再组装这个关联对象;对于一对一和多对一的多的这段默认是采用立即加载,所以不需要配置;多对多和一对多就要配置lazy="false"。

2延迟加载:延迟加载不同,当组装完一个对象后,不立即组装和它关联的对象。多对多和一对多默认采用延迟加载,一对一和多对一想实现延迟加载得配置lazy="true"。

3预先抓取:Hibernate2.x版本:outer-join="true"Hibernate3.x版本:fetch="join"。和立即检索相比,预先抓取可以减少SQL语句的条数,提高查询速度。

4批量加载:批量加载总是和立即加载或者延迟加载联系在一起的,分别为批量立即加载和批量延迟加载。T05加载策略Hibernate加载策略为了提高效率,节省资源,提供了多种数据检索策略立即加载延迟加载预先抓取批量加载同时使用同时使用T05加载策略立即加载从数据库取得字段值组装好一个对象后,会立即从数据库取出关联的附属对象,脱离Session后仍可以使用这些附属对象立即加载的适用情况:加载对象时,马上就要用到附属对象的数据一对一、多对一被关联对象是”一”这端的立即加载的配置为lazy=“false”一对一、多对一默认就是立即加载,所以只有一对多、多对多的立即加载需要在<set>元素中指定lazy=“false”T05加载策略延迟加载从数据库取得字段值组装好一个对象后,并不会立即取出附属对象。这样做通常是为了节约内存资源因为一对多、多对多关系如果设置为立即加载,将有可能会加载很多的附属对象而占据大量内存,因此这种情况常设置为延迟加载多对一、一对一设置延迟加载只需在<set>标签中设置lazy=“true”T05加载策略加载策略举例一对一默认立即加载、一般不改动一对多默认延迟加载,通过设置lazy=”false”、或fetch=”join”实现立即加载,但一般一对多尽量设成lazy=”true”,当要实现立即加载时通过HQL语句的预先抓取joinfetch实现多对一默认延迟加载,通过设置lazy=”false”或fetch=”join”实现立即加载下面以部门加载员工(一对多)为例:T05加载策略部门对员工的加载策略配置如下:<classname=“demo.bean.Department"table="Department"><setname="employees"cascade="all"lazy=“true"inverse="true"><keycolumn="deptid"></key><one-to-manyclass=“demo.bean.Employee"/></set></class>false:加载部门时立即加载员工true:加载部门时不加载员工<classname=“demo.bean.Employee"table="Employee"><many-to-onename="dept"class=“demo.bean.Department"column="deptid"lazy="false"></many-to-one></class>T05加载策略//根据部门OID查找部门publicDepartmentgetDeptById(Integeroid){Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Departmentdept=(Department)session.get(Depaertment.class,oid);Setemps=dept.getEmployees();//不过采用何种加载方式,这里没有错误mit();session.close();returndept;Setemps=dept.getEmployees();//如果lazy=“true”,这里将出错}T05加载策略显示部门详细信息如果部门对员工采用的是延迟加载,那么这里将会出错T05加载策略lazy=”false”与fetch=

“join”的区别

1、lazy=”false”,立即加载,一次只查一个表。产生语句过多,如果数据多的话查询效率较低2、fetch=”join”,使用连接查询,减少查询次数,提交查询效率下面通过例子说明:T05加载策略lazy=”false”部门对员工采用lazy=”false”立即加载员工的配置及代码:

<setname="employees"inverse="true"cascade="all"

lazy="false">

<keycolumn="deptid"></key>

<one-to-manyclass=“demo.bean.Employee"/>

</set>publicstaticvoidmain(Stringargs[]){

Sessionsession=HibernateSessionFactory.getSession();

Transactiontx=session.beginTransaction();

Departmentdept=(Department)session.get(Department.class,51);

mit();

session.close();

System.out.println("部门名称:"+dept.getDeptName());

Setemps=dept.getEmployees();

for(Iteratoriter=emps.iterator();iter.hasNext();){

Employeeemp=(Employee)iter.next();

System.out.println("员工名字:"+emp.getEmpName());

}

}T05加载策略lazy=”false”执行main方法,得到控制台信息:T05加载策略fetch="join"部门对员工采用fetch="join"预先抓取员工的配置及代码:

<setname="employees"inverse="true"cascade="all"

fetch=“join”>

<keycolumn="deptid"></key>

<one-to-manyclass=“demo.bean.Employee"/>

</set>publicstaticvoidmain(Stringargs[]){

Sessionsession=HibernateSessionFactory.getSession();

Transactiontx=session.beginTransaction();

Departmentdept=(Department)session.get(Department.class,51);

mit();

session.close();

System.out.println("部门名称:"+dept.getDeptName());

Setemps=dept.getEmployees();

for(Iteratoriter=emps.iterator();iter.hasNext();){

Employeeemp=(Employee)iter.next();

System.out.println("员工名字:"+emp.getEmpName());

}

}T05加载策略fetch="join"执行main方法,得到控制台信息:我们可以很明显的看出,查询同样的数据,采用fetch=“join”比用lazy=“false”少了两条语句,提高了查询效率;当然,数据量越多,减少的sql语句就越多这里还得注意,如果你使用了fetch=“join”,那么HQL语句会忽略配置文件中的立即加载(当部门对员工fetch=”join”并且使用HQL语句”fromDepartment”不会取出员工)。

T05加载策略inverse属性inverse属性表示将关系转由对方维护 session=HibernateSessionFactory.getSession();

//开启连接 tx=session.beginTransaction();//开启事务 Departmentdept=(Department)session.get(Departemt.class,oid); dept.getEmployees.add(emp);//inverse=false mit(); session=HibernateSessionFactory.getSession();

//开启连接 tx=session.beginTransaction();//开启事务

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论