首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多到多hibernate xml配置

多到多hibernate xml配置
EN

Stack Overflow用户
提问于 2015-12-30 16:10:44
回答 2查看 1.6K关注 0票数 6

我有这样的DB关系。

我想要多到多的关系。在PLAYERPRIVILEGE之间。你能帮我修复我的.xml吐露吗?

预期结果:我希望能够执行:String hql = "from Player as p right outer join p.privilages as priv";

实战:到目前为止我得到的是:

org.hibernate.MappingException:外键(FK8CD18EE134F64423:PLAYER ID )必须具有与引用的主键相同的列数(特权ID、特权)

代码语言:javascript
复制
<hibernate-mapping>
    <class name="model.Privilage" table="PRIVILAGE">
        <id name="id" type="int" >
            <column name="ID"  precision="5" scale="0"/>
            <generator class="increment"/>
        </id>

        <set name="players" table="PLAYER"
             inverse="false" lazy="true" fetch="select" cascade="all" >
            <key>
                <column name="ID"/>
            </key>
            <many-to-many entity-name="model.Player">
                <column name="ID" not-null="true" />
            </many-to-many>
        </set>

        <property name="privilage" type="string">
            <column name="PRIVILAGE" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

代码语言:javascript
复制
<class name="model.Player" table="PLAYER">
    <id name="playerId" type="int" >
        <column name="ID" precision="5" scale="0"/>
        <generator class="sequence">
            <param name="sequence">PLAYER_SEQ</param>
        </generator>
    </id>
    <set name="privilages" table="PRIVILAGE"
         inverse="false" lazy="true" fetch="select" cascade="all" >
        <key>
            <column name="ID"/>
        </key>
        <many-to-many entity-name="model.Privilage">
            <column name="PRIVILAGE" not-null="true" />
        </many-to-many>
    </set>
    <!-- ... -->
</class>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-12 09:46:04

您应该引用名为PLAYER_PRIV的多到多关系表:

代码语言:javascript
复制
<set name="privilages" table="PLAYER_PRIV"
     inverse="true" lazy="true" fetch="select">
    <key>
        <column name="ID"/>
    </key>
    <many-to-many entity-name="model.Privilage">
        <column name="PRIV_ID" not-null="true"/>
    </many-to-many>
</set>

代码语言:javascript
复制
<set name="players" table="PLAYER_PRIV"
     inverse="false" lazy="true" fetch="select">
    <key>
        <column name="ID"/>
    </key>
    <many-to-many entity-name="model.Player">
        <column name="PLAYER_ID" not-null="true"/>
    </many-to-many>
</set>
票数 3
EN

Stack Overflow用户

发布于 2015-12-30 16:59:36

您正在映射错误的关联表名称及其列。

1)双方的关联表相同(PLAYER_PRIV):

代码语言:javascript
复制
<set name="privilages" table="PLAYER_PRIV"
    ...
</set>

<set name="players" table="PLAYER_PRIV"
    ...
</set>

2) Privilage映射中的列:

代码语言:javascript
复制
<key>
   <column name="PRIV_ID"/>
</key>
<many-to-many entity-name="model.Player">
   <column name="PLAYER_ID" not-null="true" />
</many-to-many>

Player映射中,情况正好相反:

代码语言:javascript
复制
<key>
   <column name="PLAYER_ID"/>
</key>
<many-to-many entity-name="model.Privilage">
   <column name="PRIV_ID" not-null="true" />
</many-to-many>

3)除此之外,你必须选择一边成为inverse。来自文档

如果关联是双向的,则一方必须是所有者,一方必须是反向的(即。在更新关联表中的关系值时,它将被忽略)。

4)您可能不希望在多到多的关联中使用cascade=all,因为在删除特权时,您可能不希望删除授予特权的所有参与者。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34533016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档