在做项目过程,出现一错误如下:
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
- 高手啊