外键必须具有与引用主键hibernate相同的列数 - 多对多

时间:2013-01-29 09:22:50

标签: java spring hibernate hibernate-mapping

我有域类 - 用户,角色,组,组角色

用户域

private long id, 
private String userName, 
private String password, 
Set<Role> roles = new HashSet<Role>();

User.hbm.xml

<hibernate-mapping package="uk.co.jmr.sdp.domain">
<class name="User" table="user">
        <id name="id" unsaved-value="-1">
            <generator class="native"/>
        </id>
        <property name="userName" column="user_name"/>
        <property name="password" column="password"/>
        <property name="emailId" column="email_id"/>

        <set name="roles" table="user_role" lazy="false" cascade="all">
            <key column="user_id"/>
            <many-to-many column="role_id" class="Role" fetch="join"/>
        </set>

        <set name="groupRoles" table="user_grouprole" lazy="false" cascade="all">
            <key column="user_id"/>
            <many-to-many column="group_role_id" class="GroupRole" fetch="join"/>
        </set> 

</class>
</hibernate-mapping>

我有user_grouprole表作为用户和一组grouproles的连接表 我有user_role表作为用户和角色集的连接表

群组域

private long id;
private String groupName;
private Set<Role> roles = new HashSet<Role>();

Group.hbm.xml

<hibernate-mapping package="uk.co.jmr.sdp.domain">
 <class name="Group" table="group">
 <id name="id" unsaved-value="-1">
        <generator class="native"/>
 </id>
 <property name="groupName" column="group_name"></property>

 <set name="roles" table="group_role" lazy="false" cascade="all">
        <key column="group_id"/>
        <many-to-many column="role_id" class="Role" fetch="join"/>
    </set>

GroupRole

private long id;
private Role role;
private Group group;

GroupRole.hbm.xml

<class name="GroupRole" table="group_role">
    <id name="id" unsaved-value="-1">
            <generator class="native"/>
    </id>
    <many-to-one name="role" class="uk.co.jmr.sdp.domain.Role"
            column="role_id" lazy="false" not-null="true" />

    <many-to-one name="group" class="uk.co.jmr.sdp.domain.Group"
            column="group_id" lazy="false" not-null="true" /> 

 </class>
</hibernate-mapping>

当我尝试使用主类测试时,我得到一个映射错误,如hibernate映射错误之类的  外键(FK5110401A8398947:user_grouprole [group_role_id]))必须与引用的主键具有相同的列数(group_role [group_id,role_id])

这是什么错误?为什么我会收到此错误?我该怎么做才能纠正这个错误???任何方案?谁能解释一下这个错误是什么?

先谢谢

1 个答案:

答案 0 :(得分:3)

您的错误告诉您的表USER在名为GROUP_ROLE_ID的列上包含外键,但您引用的表GROUP_ROLE定义了它的主键,其中包含两列ROLE_ID和GROUP_ID,这对于关系表来说非常常见。

在我看来,映射GroupRole的唯一原因是因为您需要在User实体中使用它。好吧,如果您的域模型确实正确,那么您需要考虑如何同步用户的FK和GroupRole的PK。为此你可以:

  1. 为复合键创建PK对象,或在映射中正确定义ID;
  2. 在GroupRole表中更改PK定义。
  3. 最好的问候。