我有这样的DB关系。

我想要多到多的关系。在PLAYER和PRIVILEGE之间。你能帮我修复我的.xml吐露吗?
预期结果:我希望能够执行:String hql = "from Player as p right outer join p.privilages as priv";
实战:到目前为止我得到的是::
org.hibernate.MappingException:外键(FK8CD18EE134F64423:PLAYER ID )必须具有与引用的主键相同的列数(特权ID、特权)
<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>和
<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>
发布于 2016-01-12 09:46:04
您应该引用名为PLAYER_PRIV的多到多关系表:
<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>和
<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>发布于 2015-12-30 16:59:36
您正在映射错误的关联表名称及其列。
1)双方的关联表相同(PLAYER_PRIV):
<set name="privilages" table="PLAYER_PRIV"
...
</set>
<set name="players" table="PLAYER_PRIV"
...
</set>2) Privilage映射中的列:
<key>
<column name="PRIV_ID"/>
</key>
<many-to-many entity-name="model.Player">
<column name="PLAYER_ID" not-null="true" />
</many-to-many>在Player映射中,情况正好相反:
<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,因为在删除特权时,您可能不希望删除授予特权的所有参与者。
https://stackoverflow.com/questions/34533016
复制相似问题