当前位置: 首页 > 知识库问答 >
问题:

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

吕灿
2023-03-14

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

用户域

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>();

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>

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

这个错误是什么?为什么我得到这个错误?我应该怎么做来纠正这个错误???有什么解决方案吗?有人能解释一下这个错误是什么吗?

感谢提前

共有1个答案

嵇星海
2023-03-14

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

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

  1. 为组合键创建PK对象,或在映射中正确定义ID
  2. 更改GroupRole表中的PK定义

最好的问候。

 类似资料:
  • 我有一个实体,叫做FatRabbitCarrot: 而且很管用。现在上面的类已经替换了字段名,但是结构和我们的存储库是一样的。 然后我尝试添加一个新实体,该实体在上面的类中有一个外键。让我们把这门课叫做NutToffee。FatRabbitCarrot与这个新实体有一对一的关系,而实体本身应该有一对一的关系: 对我来说,这似乎是一个有效的类。但看起来不像。我们正在使用Java8、Hibernate

  • 我知道这个主题在这里讨论了很多次,但我仍然坚持一个例外:外键必须与引用的主键具有相同的列数。 (我正在使用spring数据和hibernate) 我的身份证类别: 我的实体: 对于这种构造,我得到以下例外情况: 导致:org.hibernate.MappingException:外键(FK_ad3h9gu4labg6ix34bei3poxt:proxy_dienst_关系[parent_diens

  • 嗨,下面是我的实体,它们之间有许多联系 大学生JAVA 学生详细信息。JAVA appmain.java 下面是我的2表中的列 “学生详细信息”中的“值”应输入学生表的“用户角色” 但当我执行appmain时,我的错误率就降低了 我试图解决这个问题,但它显示出同样的错误请建议我如何解决这个问题

  • 问题内容: 目标:我想在ImportJob中使用importJobId作为分配表ID的外键,这样,当我们那时具有importJobId时,那么我们只能在ID中分配ID,因为没有Job时就无法进行任何分配。 ImportJob表的复合主键为[ORGID,IMPORTJOBTYPE],正在尝试使用以下方式在hibernate状态下创建外键关系: 在Allocation.hbm.xml中无法解决,并收到

  • 问题内容: 目标:我想在ImportJob中使用importJobId作为分配表ID的外键,这样,当我们那时具有importJobId时,那么我们只能在ID中分配ID,因为没有Job时就无法进行任何分配。 ImportJob表的复合主键为[ORGID,IMPORTJOBTYPE],正在尝试使用以下方式在休眠状态下创建外键关系: 在Allocation.hbm.xml中无法解决,并收到以下错误消息:

  • 我在实体和之间有多对多的关系,我使用了一个名为的关联表。 AbstractEntity.java: FunctionEntity.java: FunctionProduceResultEntity.java: ResultEntity.java 功能实用性: 启动服务器时,出现以下错误: 还有类似的问题,例如外键必须具有与多对一映射中引用的主键相同的列数,以及Hibernate MappingEx