200分,请大家解释一个关于hibernate的问题

问题描述

各位大哥,小生问大家一个问题,我做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当你没有特别的设立一个主键的时候,数据库会报错或者默认的把所有的字段弄在一起设立一个联合主键,看各数据库的介绍。这个和多对多什么的没关系,但是多对多的中间表接受这个约束。约束的原因,因为重复的数据会造成数据库的功能大幅度下降。没有重复数据要至少比有重复数据的查找,排序等快几个数量级。
解决方案:
说具体点,没看明白你的意思
解决方案:
你数据库设计的时候可能也有问题吧

时间: 2025-01-24 00:18:37

200分,请大家解释一个关于hibernate的问题的相关文章

解释一个关于Hibernate lazy的问题

问题 使用Hibernate时意外报错: Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53) at o

printf-求大神解答,关于内存解析以及类型转换的编译器底层实现,图中的结果请给我一个完整的解释,谢谢

问题描述 求大神解答,关于内存解析以及类型转换的编译器底层实现,图中的结果请给我一个完整的解释,谢谢 #if 1 #include using namespace std; int main() { char str[] = "12345"; long pLong = (long)str; pLong++; printf("%dn", pLong); return 0; } #endif 解决方案 这代码在我的编译器上没法编译 我修改了下 #include <

急求一个Spring+Hibernate对MySQL数据库进行增删改查的例子!!!!

问题描述 现急求一个Spring+Hibernate对MySQL数据库进行增删改查的例子,例子比较简单也可以,主要就是要对数据库进行增删改查操作.如果哪位有的话请发到邮箱(395897780@qq.com),或者告诉我网址也行!最好是能连工程一起打包下载的,能够运行的,由于刚刚开始学,想下个完整的下来,怎样便于分析!!!本人在这里先表示感谢!!!!! 解决方案 解决方案二:其实不用这样,你用工具做,其中的包就可以生成的,注意:Hibernate一定要托管给Spring:之后以前Hibernate

离散数学-请各位解释一下真值函数的概念。

问题描述 请各位解释一下真值函数的概念. 老师课堂上讲了,也上网查了,但还是不懂,所以来问大家.希望能具体点. 解决方案 因为每个参数都是bool值,每个函数有确定的值. 所以我们可以列出全部可能2^(参数个数),以及对应的返回值,这就是真值表.比如all这个函数,我们可以列出: b1 b2 b3 result 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 解决方案二: 它采用来自 {T,F} (就是真实和虚假)的

跪求 树状菜单。200分悬赏!!!!!!

问题描述 XML+数据库生成的也行.JQUERY+数据库生产的也行.但是一定要动态可无限添加子节点的.如果存在子节点的不能删除.满足以上要求的都可以的.跪求!!!!!!!!!!!!!!!!!!!!!!!!!!!我的邮箱61916518@qq.com谢谢各位大侠.新手刚接到项目.无奈求助啊,网上都找了好几天了!在线等帮助等邮箱!!!!!!!!200分悬赏!!!!!!还有一百分如果合适我用的马上发帖送分!!!!!!!! 解决方案 解决方案二:<scripttype="text/javascri

解释spring,struts,hibernate优缺点

解释spring,struts,hibernate优缺点 Struts优点:对视图层进行封装 更好的分离视图层和控制层 对数据进行封装 缺点: 1 .转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录.文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复

方法-请高手提供一个可行的reportViewer的打印思路

问题描述 请高手提供一个可行的reportViewer的打印思路 接到一个很简单的要求,有一个小表格,要从数据库中提出相应的格子中后进行打印,虽然填充字段很少,但条数很多,由于表格很小,A4幅面的纸要纵向打3个,前面都很简单,用reportViewer很快搞定,问题出在打印排版上,由于要产生很多页,因为表格和页幅的不能很精确控制,在后面会发生表跨页的问题,影响使用.不知各位高手能提供有效的思路. 我想了几个方法都未成功: 1.在一页上做了三个同样的小表格分了三组,进行不同数据源的字段绑定,在最后

请教-请我我一个初学Java的人应该看什么书?????

问题描述 请我我一个初学Java的人应该看什么书????? 大家好,我是一个新手,初学Java,我想请问我大学毕业转行学Java,应该看什么书,在线请教 解决方案 估计你没什么兴趣学什么东西,都毕业了已经过了求知的年龄.你的意图无非是掌握一种能混饭吃的本领. 因此,去耐心学习理论,你不感兴趣. 推荐你看李刚的疯狂系列.比如<疯狂Java讲义>,这种书估计对你找一个初级码农的工作比较有现实的意义. 解决方案二: 超级谢谢,我最近才学的,也乱啊,没办法,为了生活,只有重新学习 解决方案三: 21天

200分问:如何获取某个网站用户的所以角色,Membership内............

问题描述 我想获取任意一个我的网站的用户的所有角色来管理,使用Roles.GetRolesForUser()方法失败!!!谁能告诉我这个问题,马上给200分 解决方案 解决方案二:UP解决方案三:GetRolesForUser方法调用默认角色提供程序的RoleProvider.GetRolesForUser方法从数据源中检索当前登录的用户所属的角色.当前登录的用户由当前System.Web.HttpContext的HttpContext.User属性标识,或由Thread.CurrentPrin