谈一点我对hibernate关联关系映射的看法
2016-01-10 21:10
225 查看
hibernate作为持久层框架,除了实现最基本的ORM外,最重要的就是关联关系映射。通过配置实体间的关联,如one-to-one、one-to-many等,可以实现级联保存,级联查询等级联操作。最近在研究hibernate的关联映射,最后感觉:hibernate关联映射没太大用处,尤其是级联修改没有用,级联查询还有些用但是很鸡肋,这只是我个人的看法。我参与过几个项目,都没有使用hibernate关联映射;而且经过我自己的尝试,发现关联映射确实很难用。
首先我认为:级联保存、级联修改和级联删除是没有什么实际用处的。hibernate级联,无非是配置inverse和cascade等属性。经过我自己的尝试,使用级联操作,hibernate并没有什么特别的。我们完全可以程序里面自己控制:插入的时候,先插入父表再插入子表;删除的时候,先删除子表再删除父表。而且在代码中控制,语义更明显,效率上和hibernate也没有差异,而且实现难度也比配置级联更容易。
下面来看下级联查询:感觉也很鸡肋,主要是因为很难过滤关联的实体。可以先看下“Criteria查询”和"<set>中使用filter"这2篇文章。
想对关联实体过滤,的确可以通过Criteria或者filter或者<set>的where属性实现。但问题在于:使用where,只能写死在hbm.xml中,不能参数化;使用filter和Criteria略显繁琐,不过还好,也不是大问题。
使用HQL或者Criteria查询,无法回避一个问题:一旦在实体映射文件中配置好关联关系后,当访问关联实体的时候,hibernate会发出查询语句再次查询关联的实体,除非我们自己去设置关联的实体对象。使用filter或者where,既可以实现关联实体的懒加载,也能够实现关联实体的过滤,由于where不能参数化所以没有什么用,filter虽然略显繁琐,但是综合起来看应该是最佳选择了。
如果不需要对关联实体进行过滤,就是要在需要的时候查询出所有的关联实体,那么hibernate的关联查询确实很好用。但是如果要对关联实体过滤,那么就得稍微费一些工夫了。
首先我认为:级联保存、级联修改和级联删除是没有什么实际用处的。hibernate级联,无非是配置inverse和cascade等属性。经过我自己的尝试,使用级联操作,hibernate并没有什么特别的。我们完全可以程序里面自己控制:插入的时候,先插入父表再插入子表;删除的时候,先删除子表再删除父表。而且在代码中控制,语义更明显,效率上和hibernate也没有差异,而且实现难度也比配置级联更容易。
下面来看下级联查询:感觉也很鸡肋,主要是因为很难过滤关联的实体。可以先看下“Criteria查询”和"<set>中使用filter"这2篇文章。
想对关联实体过滤,的确可以通过Criteria或者filter或者<set>的where属性实现。但问题在于:使用where,只能写死在hbm.xml中,不能参数化;使用filter和Criteria略显繁琐,不过还好,也不是大问题。
使用HQL或者Criteria查询,无法回避一个问题:一旦在实体映射文件中配置好关联关系后,当访问关联实体的时候,hibernate会发出查询语句再次查询关联的实体,除非我们自己去设置关联的实体对象。使用filter或者where,既可以实现关联实体的懒加载,也能够实现关联实体的过滤,由于where不能参数化所以没有什么用,filter虽然略显繁琐,但是综合起来看应该是最佳选择了。
如果不需要对关联实体进行过滤,就是要在需要的时候查询出所有的关联实体,那么hibernate的关联查询确实很好用。但是如果要对关联实体过滤,那么就得稍微费一些工夫了。
相关文章推荐
- web项目中各种路径总结
- 微博
- c#--【简单】猜拳游戏
- OpenLDAP安装
- linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用
- 【mysql】关于IO/内存方面的一些优化
- 自学考试-“软件开发工具”
- storm topology优化之lib库分离
- 初识NNET神经网络
- Java精炼语言语法描述
- 奇怪的JS正则之 /[A-z]/.test("\\"); // true
- 文件读写/创建
- 2016/1/10 三种排序方法 二分法排序 快速排序 冒泡排序
- 细说进程、应用程序域与上下文之间的关系
- erlang的escript脚本
- 二叉查找树
- 老炮儿(2015)
- 接口的封装与使用
- Android编程规范-学习方法-心得总结(不断更新)
- Hough直线检测