这是我的情景,
我有 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 中的所有关联也被删除。
我做错了什么?
答案 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)
您的原始映射文件很好。您不希望cascade="delete"
- 用户应该存在于数据库中,无论他们是否是特定论坛的主持人。
* 现在当我添加用户时,(它添加到数据库中),删除他(它在数据库中删除),并再次添加相同的一个,没有关联给他
您需要重新添加相同的用户,然后您需要将该用户与子论坛重新关联: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
此外,当我删除整个子论坛时,它会尝试删除自己的用户,但我不想要它...我只想删除该关联 的
这是从子论坛到用户的级联删除。这里不要使用级联删除。而是通过subforum.getModerators().remove(user)
删除关联,然后删除子论坛。您负责手动将数据更改编码到关联和实体(两个地方)。如果只改变其中一个,那么休眠不会自动填充/清除另一个。
答案 2 :(得分:0)
这是因为您将user中的sub forum_id设置为not null。所以你不能删除用户使用的子论坛。 因此,您必须更改映射并重新创建表,或者只是在数据库中手动更改子论坛,以便user.subforum_id可以为空。 然后你可以将user.subforumId更改为null,其中user.subforumId = deletedSubforumId然后删除子论坛