专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 软件架构设计

程序员进阶之道—循序渐进

发布时间:2011-06-20 02:11:29 文章来源:www.iduyao.cn 采编人员:星星草
程序员进阶之道—稳中求进

  在做项目过程,出现一错误如下:

  Hibernate异常No row with thegiven identifier exists

  想必大家也能猜出其含义:不存在给出的标识符相对应的行。

  这种错误经常出现在主外键关联的情况。

  经过分析,本质的原因如下:外键值在主体表中不存在。因为外键值是要依赖主体表中的主键的。

  比如:学生与班级的关系是多对一,根据数据库关系模式规则,一端的主键需要放到多端作为外键。

  学生表:

   

  班级表:

 

 

  这种情况则会出现以上错误。因为学生表中的班号需要依赖班级表中的班号,班号3在主体表(班级表)中不存在。

  依据了以上的原理,分析项目中的具体问题。

  情况如下:项目中角色,用户,用户组,三者之间的关系是由一张关系表来维护。

  其中三者之间是多对多的关系。使用hibernate,我们把关系表封装了用户用户组实体,用户角色实体,用户组角色实体三个关系实体对象。

  其中,三个主体对象(用户,用户组,角色)与关系实体对象之间的关系是一对多关系。所以三个关系实体的映射文件如下:(如:用户用户组)


  若是关系表中数据如下:

 

  而角色表数据如下:

 

  

  用户组数据如下:

   

  根据用户id查找用户与用户组的关系时,Find UserGroup where 主体id=001;则会报以上错误。

  因为根据以上原理,查找关系表后,关系id002,然后再查找用户组表,不存在002,则报出外键表与主键表不匹配。

  为了解决项目中这个问题,有两种解决办法:

  一是在hql语句中,确定查找的关系类型字段。如:Find UserGroup where 主体id=001 and 关系类型=用户组。

  在Find UserRole where 主体id=001 and 关系类型=角色。

  二是在映射文件确定关联的类型。比如:在UserGroup的映射文件中,relMainBodyType字段确定为用户组,而在UserRole的映射文件中,relMainBodyType字段赋值为角色。

  其实,这个hibernate中的问题,依然是数据库中的主键与外键的关系关联问题。所以基础还是很重要的。hibernate中的映射文件中的many-to-one也好,many-to-many也罢,这些映射还是依赖数据库中关系模式的一对多,多对多,多对一的规范。

  基础是人进步的加速剂,只有基础的人,在前进的路上,才能走的越快越高越稳。

 

9楼lfmilaoshi昨天 23:42
基础是人进步的加速剂,只有基础的人,在前进的路上,才能走的越快越高越稳。米老师
8楼lsh66885天前 23:17
沙发支持
7楼liusong06055天前 22:15
题目好帅!
6楼lidaasky5天前 20:40
学习了
5楼beijiguangyong5天前 20:03
思想体现内涵,思想辅助技术
4楼StubbornPotatoes5天前 19:49
小马扎支持。
3楼mazhaojuan5天前 19:31
高深,受教……
2楼beijiguangyong5天前 16:38
板凳支持
1楼liushuijinger5天前 16:25
高手啊
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: