程序员进阶之道—稳中求进

来源:互联网 发布:建立数据库的表结构 编辑:程序博客网 时间: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也罢,这些映射还是依赖数据库中关系模式的一对多,多对多,多对一的规范。

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

 

原创粉丝点击