谈一点我对hibernate关联关系映射的看法

来源:互联网 发布:网络歌手灰色天空 编辑:程序博客网 时间:2024/06/13 21:15

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的关联查询确实很好用。但是如果要对关联实体过滤,那么就得稍微费一些工夫了。


1 0
原创粉丝点击