2

ドメインクラスがあります - ユーザー、ロール、グループ、グループロール

ユーザードメイン

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>

メインクラスでテストしようとすると、 Foreign key (FK5110401A8398947:user_grouprole [group_role_id])) must have same number of columns as the referenced primary key (group_role [group_id,role_id] のような休止状態のマッピングエラーのようなマッピングエラーが発生します )

このエラーは何ですか? なぜこのエラーが発生するのですか? このエラーを修正するにはどうすればよいですか??? 解決策はありますか? 誰でもこのエラーが何であるか説明できますか?

前もって感謝します

4

1 に答える 1

3

あなたのエラーは、テーブル USER に GROUP_ROLE_ID という名前の列に外部キーが含まれていることを示していますが、参照されているテーブル GROUP_ROLE は、ROLE_ID と GROUP_ID の 2 つの列を持つ主キーを定義しています。これは関係テーブルでは非常に一般的です。

GroupRole をマッピングしている唯一の理由は、 User エンティティでそれが必要だからです。ドメイン モデルが本当に正しい場合は、User の FK と GroupRole の PK をどのように同期させるかを考える必要があります。そのために、次のことができます。

  1. 複合キーの PK オブジェクトを作成するか、マッピングで ID を正しく定義します。
  2. GroupRole テーブルの PK 定義を変更します。

よろしくお願いします。

于 2013-01-29T16:32:35.720 に答える