`
webdev2014
  • 浏览: 683128 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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也罢,这些映射还是依赖数据库中关系模式的一对多,多对多,多对一的规范。

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics