您好,欢迎访问三七文档
加载策略课程目标对象在Hibernate中的状态加载策略介绍lazy=”false”与fetch=“join”的区别inverse=”true”insert=”false”update=”false”对象在Hibernate中的状态临时状态普通的Java对象,只是一个携带信息的载体没与session实例关联,没与数据库中记录关联持久状态持久实例在数据库中有对应的记录,并拥有持久化标识,持久实例可能是刚刚被保存,或刚刚被加载的数据脱管状态持久对象关联的Session关闭后,对象变为脱管saveOrUpdate()临时状态持久状态脱管状态get()load()find()iterator()save()update()delete()close()clear()update()evict()delete()举例说明对象状态Sessionsession=sessionFactory.openSession();//开启连接tx=session.beginTransaction();//开启事务Employeeemp=session.get(Employee.class,123);//根据主键加载emp.setEmpName(“QQ”);//对持久对象进行更改,不需要更新session.update(emp);//更新,此句没有必要tx.commit();session.close();emp.setEmpName(“QQ1”);//对脱管对象进行更改Sessionsession2=sessionFactory.openSession();//开启连接tx=session2.beginTransaction();//开启事务session2.update(emp);…..pubicclassEmpDAO{publicstaticEmployeegetEmployeeById(Integerid)Sessionsession=sessionFactory.openSession();//开启连接tx=session.beginTransaction();//开启事务Employeeemp=(Employee)session.get(Employee.class,id);//根据主键加载tx.commit();session.close();......忽略了异常处理returnemp;}Employeeemp=EmpDAO.getEmployeeById(10011);//此时emp是什么状态??emp.setEmpName(“AA”);//数据库中empName值是什么?加载策略介绍我们知道,Hiberante是一个ORM工具,它使得我们能够直接去操纵对象而不是数据库中表。Hibernate的数据检索策略也是给予对对象的操作的。数据检索策略主要包括一下几种:立即加载,延迟加载,预先抓取和批量加载。其中前三个是统一级别的,三个当中智能选择其中一个,而批量加载则可以很好的整合前面三个,还有就是预先抓取和批量加载都是为了优化前面两种方式而形成的。同时对于配置文件中的某个属性一旦设为预先抓取,则其它的数据检索方式都对这个属性失效。下面分别进行讨论:1立即检索:立即检索的时候需要在配置文件添加属性lazy=false.当Hibernate在从数据库中取得字段值组装好一个对象后,会立即再组装此对象所关联的对象,如果这个对象还有关联对象,再组装这个关联对象;对于一对一和多对一的多的这段默认是采用立即加载,所以不需要配置;多对多和一对多就要配置lazy=false。2延迟加载:延迟加载不同,当组装完一个对象后,不立即组装和它关联的对象。多对多和一对多默认采用延迟加载,一对一和多对一想实现延迟加载得配置lazy=true。3预先抓取:Hibernate2.x版本:outer-join=trueHibernate3.x版本:fetch=join。和立即检索相比,预先抓取可以减少SQL语句的条数,提高查询速度。4批量加载:批量加载总是和立即加载或者延迟加载联系在一起的,分别为批量立即加载和批量延迟加载。Hibernate加载策略为了提高效率,节省资源,提供了多种数据检索策略立即加载延迟加载预先抓取批量加载同时使用同时使用立即加载从数据库取得字段值组装好一个对象后,会立即从数据库取出关联的附属对象,脱离Session后仍可以使用这些附属对象立即加载的适用情况:加载对象时,马上就要用到附属对象的数据一对一、多对一被关联对象是”一”这端的立即加载的配置为lazy=“false”一对一、多对一默认就是立即加载,所以只有一对多、多对多的立即加载需要在set元素中指定lazy=“false”延迟加载从数据库取得字段值组装好一个对象后,并不会立即取出附属对象。这样做通常是为了节约内存资源因为一对多、多对多关系如果设置为立即加载,将有可能会加载很多的附属对象而占据大量内存,因此这种情况常设置为延迟加载多对一、一对一设置延迟加载只需在set标签中设置lazy=“true”加载策略举例一对一默认立即加载、一般不改动一对多默认延迟加载,通过设置lazy=”false”、或fetch=”join”实现立即加载,但一般一对多尽量设成lazy=”true”,当要实现立即加载时通过HQL语句的预先抓取joinfetch实现多对一默认延迟加载,通过设置lazy=”false”或fetch=”join”实现立即加载下面以部门加载员工(一对多)为例:部门对员工的加载策略配置如下:classname=“demo.bean.Departmenttable=Departmentsetname=employeescascade=alllazy=“trueinverse=truekeycolumn=deptid/keyone-to-manyclass=“demo.bean.Employee//set/classfalse:加载部门时立即加载员工true:加载部门时不加载员工classname=“demo.bean.Employeetable=Employeemany-to-onename=deptclass=“demo.bean.Departmentcolumn=deptidlazy=false/many-to-one/class//根据部门OID查找部门publicDepartmentgetDeptById(Integeroid){Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Departmentdept=(Department)session.get(Depaertment.class,oid);Setemps=dept.getEmployees();//不过采用何种加载方式,这里没有错误tx.commit();session.close();returndept;Setemps=dept.getEmployees();//如果lazy=“true”,这里将出错}显示部门详细信息如果部门对员工采用的是延迟加载,那么这里将会出错lazy=”false”与fetch=“join”的区别1、lazy=”false”,立即加载,一次只查一个表。产生语句过多,如果数据多的话查询效率较低2、fetch=”join”,使用连接查询,减少查询次数,提交查询效率下面通过例子说明:lazy=”false”部门对员工采用lazy=”false”立即加载员工的配置及代码:setname=employeesinverse=truecascade=alllazy=falsekeycolumn=deptid/keyone-to-manyclass=“demo.bean.Employee//setpublicstaticvoidmain(Stringargs[]){Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Departmentdept=(Department)session.get(Department.class,51);tx.commit();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());}}lazy=”false”执行main方法,得到控制台信息:fetch=join部门对员工采用fetch=join预先抓取员工的配置及代码:setname=employeesinverse=truecascade=allfetch=“join”keycolumn=deptid/keyone-to-manyclass=“demo.bean.Employee//setpublicstaticvoidmain(Stringargs[]){Sessionsession=HibernateSessionFactory.getSession();Transactiontx=session.beginTransaction();Departmentdept=(Department)session.get(Department.class,51);tx.commit();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());}}fetch=join执行main方法,得到控制台信息:我们可以很明显的看出,查询同样的数据,采用fetch=“join”比用lazy=“false”少了两条语句,提高了查询效率;当然,数据量越多,减少的sql语句就越多这里还得注意,如果你使用了fetch=“join”,那么HQL语句会忽略配置文件中的立即加载(当部门对员工fetch=”join”并且使用HQL语句”fromDepartment”不会取出员工)。inverse属性inverse属性表示将关系转由对方维护session=HibernateSessionFactory.getSession();//开启连接tx=session.beginTransaction();//开启事务Departmentdept=(Department)session.get(Departemt.class,oid);dept.getEmployees.add(emp);//inverse=falsetx.commit();session=HibernateSessionFactory.getSession();//开启连接tx=session.beginTransaction();//开启事务Departmentdept=(Department)session.get(Department.class,oid);emp.setDepartme
本文标题:T05 加载策略
链接地址:https://www.777doc.com/doc-796047 .html