您的位置:首页 > Web前端

【SSH三大框架】Hibernate基础第十三篇:lazy、constrained、fetch三个属性的作用和使用方法

2014-11-27 18:20 666 查看
这三个属性,个人感觉对于懒加载是很重要的,所以又重新开了一篇博客来写下这三个属性的作用和使用方法

一、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默认值为false

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=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下。

三、fetch属性:

在关联关系中定义:

1、fetch="join":主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。

2、fetch="select":select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询(1是查询主体对象的sql语句,n是根据这个列表中的n条记录的外键id查询的sql语句)。如果关联对象是延迟加载的,则在查询到主体对象后,不会根据关联外键id获取关联对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐