Java Hibernate:单向,删除多对多关联
这是我的设想 我有子论坛类,其中包含一组主持人,每个设置的实体int都是用户类 这是子论坛的映射Java Hibernate:单向,删除多对多关联,java,hibernate,many-to-many,Java,Hibernate,Many To Many,这是我的设想 我有子论坛类,其中包含一组主持人,每个设置的实体int都是用户类 这是子论坛的映射 <class name="server.Subforum"> <id name="id" type="int"> <column name="subforum_id"></column> <generator class="identity" /> </id> <pr
<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_论坛的集合中删除“版主”时,这个动作并没有反映在DB中。
(当我向同一个列表中添加新的版主时,子论坛中与版主有关联,如预期的那样)
当我删除整个子论坛时,子论坛中的所有关联\u版主也被删除
我做错了什么?更改
为此:
<set name="moderators" table="subforums_moderators"
lazy="false" cascade="delete" fetch="select" >
这是因为您将用户中的子论坛id设置为非空。因此,您不能删除用户中使用的子论坛。 因此,您必须更改映射并重新创建表,或者只需在数据库中手动更改子论坛,以便user.subform_id可以为空。 然后您可以将user.subflumid更改为null,其中user.subflumid=deletedSubforumId,然后删除子论坛
cascade=“delete”
-用户应该独立于是否是特定论坛的主持人而存在于数据库中<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>
您需要重新添加同一用户,然后需要将该用户与子论坛重新关联:子论坛。添加版主(用户)
或子论坛。get版主()。添加(用户)
事实上,应该独立创建、更新和删除用户、子论坛和主持人关联。典型工作流程:
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
子论坛.get慢化剂()删除关联。删除(用户)
,然后删除子论坛。您负责将数据更改手动编码到关联和实体(两个位置)。如果只更改其中一个,则hibernate不会自动填充/清除另一个好的,成功了!非常感谢。有一些奇怪的事情,现在当我添加用户(它添加到数据库),删除他(它在数据库中删除),并再次添加相同的一个,没有关联到他。。。而且,当我删除整个子论坛时,它会尝试删除用户本身,但我不想要它…我只想删除关联。>然后再次添加同一个,他没有关联。对不起,这不清楚。再次询问此问题。然后再次添加同一用户,因为数据库中没有与该用户的关联。您的原始映射文件应该可以工作。你能发布你从集合中删除主持人并保存到会话中的代码片段吗?现在,当我删除整个子论坛时,它会尝试从用户表中删除用户,我只想删除关联。删除关联是什么意思?关联是用户Id,对吗?并且用户Id绑定到一个用户。因此,如果您删除关联,使用级联,它也将删除用户。你到底想做什么?就像我之前说的,有3个表,子论坛,用户,子论坛主持人。最后一个是多对多关联表。它保留了子论坛id,用户id,我只想将用户从版主中删除,而不是将用户从系统中删除。因此,级联选项尝试删除用户本身,而不仅仅是关联。有人有办法只删除子论坛主持人表中的关联吗?如果我从存在于子论坛对象中的版主列表中删除用户对象,则不会删除关联。如果你不投票给在第一时间帮助过你的东西,你希望人们如何帮助你,伙计?我不想删除子论坛或用户本身。我所需要的只是删除关联,这样特定用户就不会是给定子论坛的主持人,仅此而已。那么,如果您混淆了多对多关系行为,您就不能使用3表吗?删除该集合,并使用子论坛id和
创建一个表,而不是使用对象(user)。并手动管理第三个表