各位大哥,小生问大家一个问题,我做hibernate多对多的时候,那个中间表里的数据,为什么不能重复呀?听别人说是联合主健,但是,我没有配置联合主健呀

解决方案 »

  1.   

    hibernate多对多中间表,一般都是两个外键,例如 
    用户表(user),主键:userid. 
    角色表(role),主键:roleid.
    中间表字段为两个外键:userid,roleid作为联合主键
      

  2.   

    hibernate配置多对对关系时,中间表里的记录是不能重复的,除非原表里有重复记录,那么他就违反主键约束。hibernate中间表的主键是采用主表主键和附表主键联合起来作为中间表的主键的
    中间表记录应该如下:
    UserId  |   RoleId  
     001    |     1
     001    |     2
     002    |     1
     003    |     2
    (UserId,RoleId)的情况是唯一。
      

  3.   

    没有主键怎么映射成Hibernate的实体文件呢? 那就得需要在中间表里加个联合主键了
      

  4.   

    加法(addition):如果FD A1 A2 … An-> B1 B2 … Bm和C1 C2 … Ck -> D1 D2 … Dj都成立,那么FD
    A1 A2 … AnC1 C2 … Ck-> B1 B2 … Bm D1 D2 … Dj也成立。但是要先保证A,C合集和B,D合集中无相同的元素。
      

  5.   

    我也插两句。
    中间表中,每一个字段,是可以重复的,但不能存在两个字段都是一样的情况。这就是联合主键。在Hibernate中,联合主键是不需要我们配置的,设置好了对象之间的关系之后,表间的关键由Hibernate自动帮我们维护。而对对象来说,多对多关系,通常都是一个对象引用了另一个对象的集合。按上面的,就是User对象拥有一个Role对象的集合,通常对应的字段会是roleId(这个字段可以重复,可以有多个)注意这里是在User对象所在的这张表上,而在Role对象上,它的Id是不能重复的,因为它是主键。反过来,对Role来说也是一样的,但如果只是一端做数据维护的话,另一端可以不拥有对方的引用(Role对象可以不引用User,但也可以有一个集合引用User)如果配好的之后,一个User有多个Role 那么,在中间表中,就有多条 userId——roleId了。所有的userId都只对应一个User的主键。这种对应是Hibernate自动生成的,自然也不会出现出得的情况了(而且出现重复的情况也是没有意义的,它就像一个保存了这种关系的一个集合,集合里面自然不会出现重复的元素)
      

  6.   

        中间表的存在就是为了满足多对多的对应关系啊,设计中间表就是关联表的时候,一般情况是要把userid和roleid一起作为主键来设置的,这样就不允许重复,五楼的正解了
        你问为什么不能重复,但是为什么要重复呢。在数据库里肯定可以做出一个允许重复的表,但是意义不大。就是用一个自增长的id作为主键,userid,roleid与各自的表都是多对一得关联,这样也可以有重复数据
      

  7.   

    如果楼主想包含这样的字段:
    userid, roleid
    1         1
    1         1
    ...可以再单独增加一个字段作为该表的ID
      

  8.   

    中间的关系表是存储 两张表的关系的;
    即表1的ID 和表2的ID 的组合就是一个关系;
    这个关系只需存一个,也就是不重复;
    为了实现这个就用表1的ID 和表2的ID做联合主键;个人看法;
      

  9.   

    hibernate在处理多对多关系的时候,是会生成一个中间表,且此表是联合主键的。这个联合主键是hibernate的内部机制
      

  10.   

    你干嘛要自己映射这个中间表啊?hibernate自己内部处理的,不需要你去做,你要做的多对多的两边做操作,比如说你删除一个自然就会去删除中间表的数据。大哥不需要你手动的维护中间表,不然hibernate就没用拉。谢谢。
      

  11.   

    所有的表必要要有一个主键,如果你没设置,可能是联合主键,也可能是独立的主键。
    当然这样的数据是可以存在的 比如
    id name age
    1  ban   20
    2  ban   20但是这样的数据是不能存在的,比如
    name age
    ban  20
    ban  20当你没有特别的设立一个主键的时候,数据库会报错或者默认的把所有的字段弄在一起设立一个联合主键,看各数据库的介绍。这个和多对多什么的没关系,但是多对多的中间表接受这个约束。约束的原因,因为重复的数据会造成数据库的功能大幅度下降。没有重复数据要至少比有重复数据的查找,排序等快几个数量级。