1

これは私のシナリオです。

モデレーターのセットを保持するSubForumクラスがあり、そのセットの各エンティティintはユーザークラスです。

これはサブフォーラムのマッピングです

<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 のセットから「モデレーター」を削除しようとすると、このアクションが DB に反映されないことです。(新しいモデレーターを同じリストに追加すると、予想どおりsubforums_moderatorsに関連付けがあります)。

サブフォーラム全体を削除すると、subforums_moderatorsのすべての関連付けも削除されます。

私は何を間違っていますか?

4

3 に答える 3

1
  1. 元のマッピング ファイルは問題ありません。あなたは望んでいませんcascade="delete"-ユーザーは、特定のフォーラムのモデレーターであるかどうかに関係なく、DBに存在する必要があります。

  2. *今、ユーザーを追加 (DB に追加)、彼を削除 (DB で削除)、同じユーザーを再度追加すると、彼への関連付けはありません

    同じユーザーを再度追加してから、そのユーザーをサブフォーラムに再度関連付ける必要があります: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 か所) へのデータ変更を手動でコーディングする必要があります。これらの 1 つだけを変更すると、休止状態は自動的にもう一方を設定/クリアしません。

于 2013-07-02T10:06:29.313 に答える
0

これは、user のサブ forum_id を null 以外に設定したためです。そのため、ユーザーで使用されているサブ フォーラムを削除することはできません。したがって、マッピングを変更してテーブルを再作成するか、データベースでサブフォーラムを手動で変更して、user.subforum_id を null 可能にする必要があります。次に、user.subforumIdをnullに変更できます。ここで、user.subforumId = deletedSubforumIdで、サブフォーラムを削除します

于 2013-06-30T04:06:45.243 に答える