Hibernate:单向,删除多对多关联

时间:2013-06-21 19:36:21

标签: java hibernate many-to-many

这是我的情景,

我有 SubForum 类,它拥有一组主持人,每个实体int都是用户类。

这是 SubForum

的映射
<class name="server.Subforum">
    <id name="id" type="int">
        <column name="subforum_id"></column>
        <generator class="identity" />
    </id>
    <properties name="unique_subforum" unique="true">
        <property name="name" type="java.lang.String">
            <column name="NAME" not-null="true" />
        </property>
        <property name="forumId" type="int" access="field">
            <column name="forum_id"></column>
        </property>
    </properties>
    <set name="moderators" table="subforums_moderators"
        lazy="false" fetch="select" >
        <key>
            <column name="SUBFORUM_ID" not-null="true" />
        </key>
        <many-to-many column="user_id" class="server.User" />
    </set>
</class>

这是用户映射:

<class name="server.User">
    <id name="id" type="int" access="field">
        <column name="user_id"></column>
        <generator class="identity" />
    </id>
    <property name="username" type="java.lang.String">
        <column name="USERNAME" not-null="true" />
    </property>
    <property name="password" type="java.lang.String">
        <column name="PASSWORD" />
    </property>
    <property name="registrationDate" type="java.util.Date">
    </property>
</class>

该映射按预期生成了表,子论坛,用户,subforums_moderators,具有所有正确的配置。

问题在于,当我尝试从sub_forum集合中删除“主持人”时,此操作不会反映在数据库中。 (当我将新版主添加到同一列表时, subforums_moderators 中存在关联,如预期的那样)。

当我删除整个子论坛时, subforums_moderators 中的所有关联也被删除。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

更改<set name="moderators" table="subforums_moderators" lazy="false" fetch="select" > 对此:

 <set name="moderators" table="subforums_moderators"
        lazy="false" cascade="delete" fetch="select" >

答案 1 :(得分:1)

  1. 您的原始映射文件很好。您不希望cascade="delete" - 用户应该存在于数据库中,无论他们是否是特定论坛的主持人。

  2. * 现在当我添加用户时,(它添加到数据库中),删除他(它在数据库中删除),并再次添加相同的一个,没有关联给他

    您需要重新添加相同的用户,然后您需要将该用户与子论坛重新关联:subforum.addModerator(user)subforum.getModerators().add(user)

    实际上,应该独立创建,更新和删除用户,子论坛和主持人关联。典型的工作流程:

         after  app functionality         DB operation   DB tables  
    A.   -      add user(s)               Insert         USERS
    B.   A.     add subforum with 
                starting moderator(s) 
                (link(s) to user(s))      Insert         SUBFORUMS, SUBFORUMS_MODERATORS 
    C.   B.     add moderator(s) to a 
                subforum                  Insert         SUBFORUMS_MODERATORS
    D.   B.     remove moderator(s)
                from a subforum           Delete         SUBFORUMS_MODERATORS
    E.   B.     remove a subforum         Delete         SUBFORUMS_MODERATORS, SUBFORUMS 
    F.   A.     semove a user that is 
                not a moderator of any 
                subforum                  Delete         USERS
    
  3. 此外,当我删除整个子论坛时,它会尝试删除自己的用户,但我不想要它...我只想删除该关联

    这是从子论坛到用户的级联删除。这里不要使用级联删除。而是通过subforum.getModerators().remove(user)删除关联,然后删除子论坛。您负责手动将数据更改编码到关联和实体(两个地方)。如果只改变其中一个,那么休眠不会自动填充/清除另一个。

答案 2 :(得分:0)

这是因为您将user中的sub forum_id设置为not null。所以你不能删除用户使用的子论坛。 因此,您必须更改映射并重新创建表,或者只是在数据库中手动更改子论坛,以便user.subforum_id可以为空。 然后你可以将user.subforumId更改为null,其中user.subforumId = deletedSubforumId然后删除子论坛