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

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

这是我的设想

我有子论坛类,其中包含一组主持人,每个设置的实体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>

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

问题是,当我试图从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)。并手动管理第三个表