在做项目过程,出现一错误如下:
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进阶,包含 常用设计模式、线程和并发、spring核心代码、mybatis核心代码、springboot2.0、springcloud 、docker的使用、各类面试题。
1. 本专栏的所有内容都是经过我精打磨的,所以你完全不担学不会的问题 2. 本专栏的所有配套源码已经在 GitHub 上开源(在本仓库的 code 录下,直接导
程序员进阶攻略
C/C++实践进阶之道:写给程序员看的编程书 part 1 of 2
突破思维: 1 第一部分:剑走成功偏锋——另类思维与反弹琵琶 掌握剑走偏锋的思维方式和做事方法,敢于颠覆与重建思维秩序,反弹琵琶追求成功,是每一个35岁前意图成就一番事业的人在新时代应该上的必修课。...
3本书籍 1.优秀程序员的编程习惯 2.大型程序设计 3.某公司内部培训资料
pdf格式,校招面试必备知识点,也适合出去找工作时,也适合自己测试学习。
敏捷开发的原则,程序员进阶的必备书籍。想要写出漂亮的代码,需要不断地吸取经验。
C/C++实践进阶之道:写给程序员看的编程书 part 2 of 2
考试类精品--收集、记录后端面试各个方面的攻略,以及程序员进阶升级的资料参考
介绍 DSP C2000 的开发方法,适合DSP 程序员 高手进阶
Java程序员进阶架构师推荐阅读书籍 UML其实和软件开发过程没有什么必然联系,却是软件团队协作沟通,撰写软件文档需要的工具。但是UML真正实用的图不多,看看这本书已经足够了,完全没有必要去啃《UML用户指南》之类...
DSP C2000程序员高手进阶,对初入门想提高的同学是个不错的东西
两本设计方面的书,人月神话作者叫Brooks,被认为是“IBM 360 系统之父”,思想创新方面比较出色。软件工程--实践者的思考,是关于设计和项目管理方面的指导书。
初级程序员的必修之道,如果把代码写的更简洁高效,看完了或许会有收获,无论你是学C的,还是JAVA等其他语言。都会有所收获
那么,到底中国的程序员水平比西方程序员水平差,还是中国有许多优秀的程序员 达到或超过了西方程序员同等水平呢?要解决这个问题,必须先知道程序员有多少种技术 层级,每个层级需要什么样的技术水平,然后再比较...