【问题标题】:foreign key must have same number of columns as the reference primary key hibernate - many to many外键必须具有与参考主键相同的列数休眠 - 多对多
【发布时间】:2013-01-29 09:22:50
【问题描述】:

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

用户域

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 表作为用户和组角色集的连接表 我有 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>

组角色

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>

当我尝试使用主类进行测试时,我收到一个映射错误,例如休眠映射错误,例如 外键 (FK5110401A8398947:user_grouprole [group_role_id])) 的列数必须与引用的主键 (group_role [group_id,role_id]) 的列数相同

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

提前致谢

【问题讨论】:

  • 你能解释一下'GroupRole'类的作用吗?从域定义看来,它不过是一个连接表……那你为什么要为它定义一个类呢?
  • GroupRole 类包含组和角色对象。此 grouprole 对象必须与 User 映射。用户有很多 groupRoles。

标签: java spring hibernate hibernate-mapping


【解决方案1】:

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

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

  1. 为您的复合键创建一个 PK 对象或在映射中正确定义您的 ID;
  2. 在 GroupRole 表中更改您的 PK 定义。

最好的问候。

【讨论】:

  • 感谢您的建议@thiago。我有user_grouprole 作为USERGROUP_ROLEuser_grouprole 的连接表有2PKs,1.user_id - 指用户的ID,2。 group_role_id - 指 GroupRole 的 id。 GROUP_ROLE 表有 1PK(id) 和 2FK(Group_id 和 Role_id)。但是我仍然遇到同样的错误 外键 user_grouprole [group_role_id]) must have the same number of columns as the referenced primary key (group_role [group_id,role_id])
  • 我在 no 表有多个 PK 的情况下看到了同样的错误。你解决了吗?
猜你喜欢
  • 2016-08-22
  • 2013-01-08
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多