您的位置:首页 > Web前端

[hibernate] 配置文件中的 lazy, inverse, cascade 和 fetch

2012-05-25 21:23 579 查看
[hibernate] 配置文件中的 lazy, inverse, cascade 和 fetch

2009-06-10 13:52
转自:http://hi.baidu.com/zh_m_zhou/blog/item/77464a09dc52e638e92488bb.html

作者:pocky

hibernate真的还是比较花费学习成本的,最近查阅了大量的资料,总算有所收获。在此,总结分享一下令众多初学者晕眩的lazy,inverse,cascade和fetch。

lazy,就是延时加载。

以最简单的parent和child为例子:一个parent可以有多个child,一个child只有一个parent。

当parent类的child属性的lazy为true,那么当select parent的时候,他的child不会马上被select,一直延迟到他的child需要被读写的时候再去select。

当parent类的child属性的lazy为false,那么select parent的时候,他的child会马上被select。

inverse,用于外键维护的控制。

当inverse为false,则在插入表数据之后,会再插入外键维护的记录。

当inverse为true,则在插入表数据的同时,插入外键维护的记录。

在非多对多的表关系中:

还是以parent和child为例子。假设1个parent有3个child,那么:

当inverse为false,则先insert 1 条 parent,再insert 3 条 child,再insert 3 个child的parent ID,一共7次insert。

当inverse为true,则先insert 1 条 parent,再insert 3 条 child,当然这3次insert是同时完成插入parent ID的,所以一共4次insert。

总结:在非多对多的表关系中,inverse永远为ture。

在多对多的表关系中:

中间表的外键维护通常由一方进行维护。

所以2个多方,1个inverse为ture,1个inverse为false。中间表会由inverse为false的一方维护。

总结:选择数据比较多的一方维护中间表的效率会比较高。

cascade,表的级联。

一方面,如果你熟悉数据库,表级联可以设置在数据库上。

另一方面,如果你选择设置在配置文件中,则相应的你的系统会更方便的在各个数据库之间进行移植。

级联具体情况就看业务需求了。关于级联,不明白的可查阅数据库基础理论。没什么好多说的。

fetch,就是加载子表信息所采用的方式,select或者join

以下是我个人对这个属性的理解:

xml配置文件中可以不配置,采用默认的。而他真正的作用在于:

1.通常情况为了保证效率,lazy的配置都是true的。比如有个页面需要显示parent列表,只需要parent的name属性和create time属性,因为不涉及子表信息,lazy为false的配置将大大影响效率。这样,我们就拥有了hibernate的高性能。

2.特殊情况下,我们又希望lazy为false,即当编辑某一个parent的时候,立刻获得parent的子表,乃至孙表的信息(例如当我们采用分层结构时,当信息到视图层时,hibernate的session已经断开了,所以要在逻辑层完成所有信息的载入)。我们就可以在HQL中写left/right outer/inner join fetch实现此功能。这样,我们又获得了临时的灵活性。

最后想说的,由于时间原因,没有包含实际的例子,甚至有可能有错误的理解。当然,本文只是抛砖引玉。欢迎各位读者的深入研究和指正。还有就是,参考文档有比较详细的例子,有空的话值得拜读一下哦。

参考文档
http://www.cnblogs.com/iloveu/archive/2009/02/22/1395628.html http://hi.baidu.com/gingerlic/blog/item/c377f1338ba348ff1b4cff63.html http://hi.baidu.com/xizenyin/blog/item/8ad6dfc4a31e46c338db49e1.html http://www.javaeye.com/post/278782 https://www.hibernate.org/5.html
转载自http://hi.baidu.com/zh_m_zhou/blog/item/77464a09dc52e638e92488bb.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: