程序员进阶之道—稳中求进
来源:互联网 发布:建立数据库的表结构 编辑:程序博客网 时间:2024/05/24 11:14
在做项目过程,出现一错误如下:
Hibernate异常No row with thegiven identifier exists。
想必大家也能猜出其含义:不存在给出的标识符相对应的行。
这种错误经常出现在主外键关联的情况。
经过分析,本质的原因如下:外键值在主体表中不存在。因为外键值是要依赖主体表中的主键的。
比如:学生与班级的关系是多对一,根据数据库关系模式规则,一端的主键需要放到多端作为外键。
学生表:
班级表:
这种情况则会出现以上错误。因为学生表中的班号需要依赖班级表中的班号,班号3在主体表(班级表)中不存在。
依据了以上的原理,分析项目中的具体问题。
情况如下:项目中角色,用户,用户组,三者之间的关系是由一张关系表来维护。
其中三者之间是多对多的关系。使用hibernate,我们把关系表封装了用户用户组实体,用户角色实体,用户组角色实体三个关系实体对象。
其中,三个主体对象(用户,用户组,角色)与关系实体对象之间的关系是一对多关系。所以三个关系实体的映射文件如下:(如:用户用户组)
<hibernate-mapping> <class name="com.core.permission.po.UserGroup" table="T_RELATION"> <id name="id" type="java.lang.Long"> <column name="ID" /> <generator class="sequence"> <param name="sequence">NMS_SEQ_REL_ID</param> </generator> </id> <property name="mainBodyType" type="java.lang.String"> <column name="MAIN_BODY_TYPE"/> </property> <property name="relMainBodyType" type="java.lang.String"> <column name="REL_MAIN_BODY_TYPE"/> </property> <many-to-one name="user" class="com.core.permission.po.User" fetch="join" lazy="false"> <column name="MAIN_BODY_ID" not-null="false"/> </many-to-one> <many-to-one name="group" class="com.core.permission.po.Group" fetch="join" lazy="false"> <column name="REL_MAIN_BODY_ID" not-null="false"/> </many-to-one> </class></hibernate-mapping>
若是关系表中数据如下:
而角色表数据如下:
用户组数据如下:
根据用户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也罢,这些映射还是依赖数据库中关系模式的一对多,多对多,多对一的规范。
基础是人进步的加速剂,只有基础的人,在前进的路上,才能走的越快越高越稳。
- 程序员进阶之道—稳中求进
- 程序员进阶——代码简洁之道
- 程序员进阶之道—快速理解设计
- 程序员进阶之路—如何独当一面
- 程序员进阶之路—如何独当一面
- 程序员进阶之路—如何独当一面
- 程序员进阶之路—如何独当一面
- 程序员进阶之路—如何独当一面
- 程序员进阶之路—如何独当一面
- 程序员进阶之路—如何独当一面
- 程序员进阶之路
- 程序员进阶之路
- 程序员进阶之路
- 初级程序员进阶之路
- 初级程序员进阶之路
- java程序员进阶之路
- Java程序员之技术进阶之路
- 程序员进阶篇之博客随思篇
- 为什么编程语言以及数据库要从1970年1月1日开始计算时间
- Android Animation学习笔记
- HTML页面元素加载顺序研究报告
- WHY CQRS and EVENT SOURCING
- iphone ios 如何创建缩率图
- 程序员进阶之道—稳中求进
- android4.0.3下编译framework/base/policy
- Security vulnerability in MySQL/MariaDB sql/password.c
- 希尔排序问题
- js注入测试器
- centos 安装g++
- 黑马程序员_java基础知识学习总结一
- Console命令详解,让调试js代码变得更简单
- Objective-C中的@property和@synthesize用法