所有的表必要要有一个主键,如果你没设置,可能是联合主键,也可能是独立的主键。 当然这样的数据是可以存在的 比如 id name age 1 ban 20 2 ban 20但是这样的数据是不能存在的,比如 name age ban 20 ban 20当你没有特别的设立一个主键的时候,数据库会报错或者默认的把所有的字段弄在一起设立一个联合主键,看各数据库的介绍。这个和多对多什么的没关系,但是多对多的中间表接受这个约束。约束的原因,因为重复的数据会造成数据库的功能大幅度下降。没有重复数据要至少比有重复数据的查找,排序等快几个数量级。
用户表(user),主键:userid.
角色表(role),主键:roleid.
中间表字段为两个外键:userid,roleid作为联合主键
中间表记录应该如下:
UserId | RoleId
001 | 1
001 | 2
002 | 1
003 | 2
(UserId,RoleId)的情况是唯一。
A1 A2 … AnC1 C2 … Ck-> B1 B2 … Bm D1 D2 … Dj也成立。但是要先保证A,C合集和B,D合集中无相同的元素。
中间表中,每一个字段,是可以重复的,但不能存在两个字段都是一样的情况。这就是联合主键。在Hibernate中,联合主键是不需要我们配置的,设置好了对象之间的关系之后,表间的关键由Hibernate自动帮我们维护。而对对象来说,多对多关系,通常都是一个对象引用了另一个对象的集合。按上面的,就是User对象拥有一个Role对象的集合,通常对应的字段会是roleId(这个字段可以重复,可以有多个)注意这里是在User对象所在的这张表上,而在Role对象上,它的Id是不能重复的,因为它是主键。反过来,对Role来说也是一样的,但如果只是一端做数据维护的话,另一端可以不拥有对方的引用(Role对象可以不引用User,但也可以有一个集合引用User)如果配好的之后,一个User有多个Role 那么,在中间表中,就有多条 userId——roleId了。所有的userId都只对应一个User的主键。这种对应是Hibernate自动生成的,自然也不会出现出得的情况了(而且出现重复的情况也是没有意义的,它就像一个保存了这种关系的一个集合,集合里面自然不会出现重复的元素)
你问为什么不能重复,但是为什么要重复呢。在数据库里肯定可以做出一个允许重复的表,但是意义不大。就是用一个自增长的id作为主键,userid,roleid与各自的表都是多对一得关联,这样也可以有重复数据
userid, roleid
1 1
1 1
...可以再单独增加一个字段作为该表的ID
即表1的ID 和表2的ID 的组合就是一个关系;
这个关系只需存一个,也就是不重复;
为了实现这个就用表1的ID 和表2的ID做联合主键;个人看法;
当然这样的数据是可以存在的 比如
id name age
1 ban 20
2 ban 20但是这样的数据是不能存在的,比如
name age
ban 20
ban 20当你没有特别的设立一个主键的时候,数据库会报错或者默认的把所有的字段弄在一起设立一个联合主键,看各数据库的介绍。这个和多对多什么的没关系,但是多对多的中间表接受这个约束。约束的原因,因为重复的数据会造成数据库的功能大幅度下降。没有重复数据要至少比有重复数据的查找,排序等快几个数量级。