1

这是我的场景,

我有SubForum类,它拥有一组版主,该组的每个实体 int 都是User类。

这是子论坛的映射

<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>

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

问题是当我尝试从 sub_forum 的集合中删除“主持人”时,此操作不会反映在 DB 中。(当我将新版主添加到同一列表中时,子论坛中的版主会出现预期的关联

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

我做错了什么?

4

3 回答 3

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),然后删除子论坛。您负责将数据更改手动编码到关联和实体(两个地方)。如果您只更改其中一个,则休眠不会自动填充/清除另一个。

于 2013-07-02T10:06:29.313 回答
1

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

 <set name="moderators" table="subforums_moderators"
        lazy="false" cascade="delete" fetch="select" >
于 2013-06-21T19:52:55.653 回答
0

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

于 2013-06-30T04:06:45.243 回答