问题描述
各位大哥,小生问大家一个问题,我做hibernate多对多的时候,那个中间表里的数据,为什么不能重复呀?听别人说是联合主健,但是,我没有配置联合主健呀
解决方案
解决方案二:
如果回答正确加100分
解决方案三:
楼主还要多点描述吧...
解决方案四:
hibernate多对多中间表,一般都是两个外键,例如用户表(user),主键:userid.角色表(role),主键:roleid.中间表字段为两个外键:userid,roleid作为联合主键
解决方案五:
应该可以重复啊,因为它们是属于两个表,两个字段是没内在的关联的
解决方案六:
hibernate配置多对对关系时,中间表里的记录是不能重复的,除非原表里有重复记录,那么他就违反主键约束。hibernate中间表的主键是采用主表主键和附表主键联合起来作为中间表的主键的中间表记录应该如下:UserId|RoleId001|1001|2002|1003|2(UserId,RoleId)的情况是唯一。
解决方案七:
没有主键怎么映射成Hibernate的实体文件呢?那就得需要在中间表里加个联合主键了
解决方案八:
加法(addition):如果FDA1A2…An->B1B2…Bm和C1C2…Ck->D1D2…Dj都成立,那么FDA1A2…AnC1C2…Ck->B1B2…BmD1D2…Dj也成立。但是要先保证A,C合集和B,D合集中无相同的元素。
解决方案九:
你的分数好多呀,一个这个问题就这么舍得。
解决方案十:
这个问题你想知道什么嘛!!!说具体点
解决方案十一:
引用5楼fishrui的回复:
hibernate配置多对对关系时,中间表里的记录是不能重复的,除非原表里有重复记录,那么他就违反主键约束。hibernate中间表的主键是采用主表主键和附表主键联合起来作为中间表的主键的中间表记录应该如下:UserId | RoleId001 | 1001 | 2002 | 1003 | 2(UserId,RoleId)的情况是唯一。
楼上正解!
解决方案十二:
,但是,我没有配置联合主健呀?
解决方案十三:
我也插两句。中间表中,每一个字段,是可以重复的,但不能存在两个字段都是一样的情况。这就是联合主键。在Hibernate中,联合主键是不需要我们配置的,设置好了对象之间的关系之后,表间的关键由Hibernate自动帮我们维护。而对对象来说,多对多关系,通常都是一个对象引用了另一个对象的集合。按上面的,就是User对象拥有一个Role对象的集合,通常对应的字段会是roleId(这个字段可以重复,可以有多个)注意这里是在User对象所在的这张表上,而在Role对象上,它的Id是不能重复的,因为它是主键。反过来,对Role来说也是一样的,但如果只是一端做数据维护的话,另一端可以不拥有对方的引用(Role对象可以不引用User,但也可以有一个集合引用User)如果配好的之后,一个User有多个Role那么,在中间表中,就有多条userId——roleId了。所有的userId都只对应一个User的主键。这种对应是Hibernate自动生成的,自然也不会出现出得的情况了(而且出现重复的情况也是没有意义的,它就像一个保存了这种关系的一个集合,集合里面自然不会出现重复的元素)
解决方案十四:
我顶~~~~加油~
解决方案十五:
中间表的存在就是为了满足多对多的对应关系啊,设计中间表就是关联表的时候,一般情况是要把userid和roleid一起作为主键来设置的,这样就不允许重复,五楼的正解了你问为什么不能重复,但是为什么要重复呢。在数据库里肯定可以做出一个允许重复的表,但是意义不大。就是用一个自增长的id作为主键,userid,roleid与各自的表都是多对一得关联,这样也可以有重复数据引用5楼fishrui的回复:
hibernate配置多对对关系时,中间表里的记录是不能重复的,除非原表里有重复记录,那么他就违反主键约束。hibernate中间表的主键是采用主表主键和附表主键联合起来作为中间表的主键的中间表记录应该如下:UserId | RoleId 001 | 1001 | 2002 | 1003 | 2(UserId,RoleId)的情况是唯一。
解决方案:
引用12楼filemon的回复:
我也插两句。中间表中,每一个字段,是可以重复的,但不能存在两个字段都是一样的情况。这就是联合主键。在Hibernate中,联合主键是不需要我们配置的,设置好了对象之间的关系之后,表间的关键由Hibernate自动帮我们维护。而对对象来说,多对多关系,通常都是一个对象引用了另一个对象的集合。按上面的,就是User对象拥有一个Role对象的集合,通常对应的字段会是roleId(这个字段可以重复,可以有多个)注意这里是在User对象所在的这张表上,而在Role对象上,它的Id是不能重复的,因为它是主键。反过来,对Role来说也是一样的,但如果只是一端做数据维护的话,另一端可以不拥有对方的引用(Role对象可以不引用User,但也可以有一个集合引用User)如果配好的之后,一个User有多个Role那么,在中间表中,就有多条userId——roleId了。所有的userId都只对应一个User的主键。这种对应是Hibernate自动生成的,自然也不会出现出得的情况了(而且出现重复的情况也是没有意义的,它就像一个保存了这种关系的一个集合,集合里面自然不会出现重复的元素)
够详细的~~~
解决方案:
如果楼主想包含这样的字段:userid,roleid1111...可以再单独增加一个字段作为该表的ID
解决方案:
一个数据对照表,有2行数据完全一样,到底是为了什么呢?先搞清楚需求再说其它的!
解决方案:
我也想学学呵呵
解决方案:
表结构贴出来瞧瞧
解决方案:
中间的关系表是存储两张表的关系的;即表1的ID和表2的ID的组合就是一个关系;这个关系只需存一个,也就是不重复;为了实现这个就用表1的ID和表2的ID做联合主键;个人看法;
解决方案:
hibernate在处理多对多关系的时候,是会生成一个中间表,且此表是联合主键的。这个联合主键是hibernate的内部机制
解决方案:
你干嘛要自己映射这个中间表啊?hibernate自己内部处理的,不需要你去做,你要做的多对多的两边做操作,比如说你删除一个自然就会去删除中间表的数据。大哥不需要你手动的维护中间表,不然hibernate就没用拉。谢谢。
解决方案:
多对多一般都是裁拆成两个多对一吧。。
解决方案:
引用11楼xueac4的回复:
,但是,我没有配置联合主健呀?
中间表就是起联合主键的作用
解决方案:
顶24楼
解决方案:
那您要设表的主键,要么加个主键ID,或把这两列设为联合主键
解决方案:
所有的表必要要有一个主键,如果你没设置,可能是联合主键,也可能是独立的主键。当然这样的数据是可以存在的比如idnameage1ban202ban20但是这样的数据是不能存在的,比如nameageban20ban20当你没有特别的设立一个主键的时候,数据库会报错或者默认的把所有的字段弄在一起设立一个联合主键,看各数据库的介绍。这个和多对多什么的没关系,但是多对多的中间表接受这个约束。约束的原因,因为重复的数据会造成数据库的功能大幅度下降。没有重复数据要至少比有重复数据的查找,排序等快几个数量级。
解决方案:
说具体点,没看明白你的意思
解决方案:
你数据库设计的时候可能也有问题吧