2

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

用户域

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

用户.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>();

组.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;

组角色.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] )

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

提前致谢

4

1 回答 1

3

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

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

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

此致。

于 2013-01-29T16:32:35.720 回答