【SSH三大框架】Hibernate基础第十三篇:lazy、constrained、fetch三个属性的作用和使用方法
2014-11-27 18:20
666 查看
这三个属性,个人感觉对于懒加载是很重要的,所以又重新开了一篇博客来写下这三个属性的作用和使用方法
1、在集合中定义:
<set name="name" lazy="true/false/extra" >
默认为true
默认为true情况下,只要使用到了Set对象,就会把整个set全部查询出来。
false情况下,不使用Lazy,查询Lazy所属的对象时,set就会被查询上来。需要类增强工具。
extra情况下,比较智能,根据查询的内容,生成不同的SQL语句。效率会高一些。
例子:在我们前边多对一的关系中(部门与员工):
Department.hbm.xml:
2、单端关联
<many-to-one name="name" lazy="false/proxy/no-proxy">
默认为proxy
false:不使用Lazy。
no-proxy:需要类增强工具
1、constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。
2、one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
3、one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读,如2个表user,car;在位false时sql如下:select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下。
1、fetch="join":主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
2、fetch="select":select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询(1是查询主体对象的sql语句,n是根据这个列表中的n条记录的外键id查询的sql语句)。如果关联对象是延迟加载的,则在查询到主体对象后,不会根据关联外键id获取关联对象。
一、lazy属性:
lazy概念:只有真正使用该对象时,才会创建。对于hibernate而言,真正使用时才会发出SQL语句1、在集合中定义:
<set name="name" lazy="true/false/extra" >
默认为true
默认为true情况下,只要使用到了Set对象,就会把整个set全部查询出来。
false情况下,不使用Lazy,查询Lazy所属的对象时,set就会被查询上来。需要类增强工具。
extra情况下,比较智能,根据查询的内容,生成不同的SQL语句。效率会高一些。
例子:在我们前边多对一的关系中(部门与员工):
Department.hbm.xml:
<set name="emps" inverse="true" lazy="false"> <key column="depart_id" /> <one-to-many class="Employee" /> </set>通过这个可以关闭默认的懒加载
2、单端关联
<many-to-one name="name" lazy="false/proxy/no-proxy">
默认为proxy
false:不使用Lazy。
no-proxy:需要类增强工具
<many-to-one name="depart" column="depart_id" lazy="false"/>
二、constrained属性:
constrained默认值为false1、constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。
2、one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
3、one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读,如2个表user,car;在位false时sql如下:select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下。
三、fetch属性:
在关联关系中定义:1、fetch="join":主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
2、fetch="select":select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询(1是查询主体对象的sql语句,n是根据这个列表中的n条记录的外键id查询的sql语句)。如果关联对象是延迟加载的,则在查询到主体对象后,不会根据关联外键id获取关联对象。
相关文章推荐
- 【SSH三大框架】Hibernate基础第三篇:实体对象的三种状态以及get、load、persist三个方法的详解
- 【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释
- 【SSH三大框架】Hibernate基础第十篇:inverse属性详解
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
- 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能
- 【SSH三大框架】Hibernate基础第七篇:一对多关联关系的操作
- 使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
- 【SSH三大框架】Hibernate基础第四篇:Hibernate的两种查询方式:hql和Criteria
- 使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)
- 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能
- 【SSH三大框架】Struts2基础第八篇:Struts2用AJAX实现JSON插件的使用
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及添加、查询
- 【SSH三大框架】Hibernate基础第一篇:编写第一个Hibernate程序
- 【SSH三大框架】Hibernate基础第六篇:多对一关联关系的映射、分析及加入、查询
- 【SSH三大框架】Hibernate基础第十一篇:对继承映射的操作
- 使用MyEclipse整合ssh(Struts、Spring、Hibernate)三大框架(环境搭载+实例源码下载)
- 【SSH三大框架】Hibernate基础第九篇:cascade关联关系的级联操作
- 【SSH三大框架】Hibernate基础第十一篇:对继承映射的操作