2013-06-21 32 views
1

这是我的情况下,休眠:单向,消除很多-to-many关联

我有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的set中删除“版主”时,此操作未反映在数据库中。 (当我将新主持人添加到同一列表中时,subforums_moderators与预期相关)。

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

我做错了什么?

+0

好的,它工作! 谢谢。 有一些奇怪的现象,现在当我添加用户,(它添加到数据库),删除他(它在数据库中删除),并再次添加相同的一个,他没有任何关联... 还有,当我删除整个subforum,它试图删除用户它自己,但我不想要它...我只想删除关联。 – CaTz

+0

>并再次添加同一个,这与他没有任何关联。对不起,这并不明确。再问一次。 – happybuddha

+0

并再次添加同一个用户,在数据库中与他没有任何关联。 – CaTz

回答

1

变化<set name="moderators" table="subforums_moderators" lazy="false" fetch="select" > 这样:

<set name="moderators" table="subforums_moderators" 
     lazy="false" cascade="delete" fetch="select" > 
+0

现在,当我删除整个子论坛,它试图从用户表中删除用户,我想只删除关联。 – CaTz

+0

你是什么意思删除关联?该关联是用户标识,对吗?用户标识绑定到用户。所以如果你删除关联,级联它也会删除用户。你到底想要做什么? – happybuddha

+0

像我之前说过的那样,有3个表,subforums,users,subforums_moderators。最后一个是多对多的关联表。它保持subforum_id,user_id,我只想从主持人中删除用户,而不是从系统中删除用户。所以级联选项会尝试除去用户本身,而不仅仅是关联。 – CaTz

0

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

+0

我不想删除子论坛或用户本身。我需要的只是删除关联,因此特定用户不会成为给定子论坛的主持人,就是这样。 – CaTz

+0

然后你不能只使用3表,如果你混淆了多对多的关系行为?删除该集,并使用sub forum_id和''而不是使用对象(用户)创建1个表。并手动管理第三个表格 – Angga

1
  1. 你原来的映射文件的罚款。你不需要cascade="delete" - 用户应该存在于数据库中,而不管他们是否是特定论坛的管理员。

  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的,它试图删除的用户它的自我,但我不希望它...我只想要删除的关联

    这是一个从级联删除subforum的用户。这里不要使用级联删除。相反,请通过subforum.getModerators().remove(user)删除关联,然后删除该子论坛。您负责将数据更改手动编码到关联和实体(两个地方)。如果你只改变其中的一个,那么hibernate不会自动填充/清除另一个。