hibernate的关联可以代替数据库外键进行约束?

本来还挺明白,我百度了一下“hibernate没有外键的2张表如何进行关联”很多回答不需要外键也能进行关联,越看越玄乎,最后甚至看到了“不需要数据库的外键约束,hibernate配置好关联就行"的定论,我整个人都炸了,hibernate有这么强大?怎么不上天呢?2个问题,请各位回答下:
1.没有外键的2张表真的能建立一对多,多对一等等这些关联?且不说能不能关联,就算能关联,没有下面数据库外键支持的关联有个卵用?我怎么知道这张表的某条数据与另一张表中某些纪录有关?凭什么?更不用说通过一个持久化的实例查出其域中相关联的另一个类实例的属性了(a.b.getxxx()),而且我写了个测试,没有外键与域中关联类的实例做映射,在生成的sql中直接把相关联类实例的名字当作字段进行数据操作,肯定报错啊!也就是说根本不能在域中将关联类的实例作为成员,所以 没有外键的2张表真的能建立关联,还是我认识有局限方法不对?
2.如果我的想法是对的,也就是说没有外键不能建立2个实体类之间多对一等这些关联,那么所谓“hibernate配置关联取代外键约束“是怎么一回事,无论是实际操作还是企业环境中,都觉得外键有必要但是成本太高,数据库的变动拓展起来太麻烦,所以我在想 他们的”hibernate配置取代数据库外键约束"肯定是跟关联设置无关的,这个只影响查询吧,所以他们是再说"我不用外键,我也不用关联,所有的有关系的表,在数据操作时,让开发人员去记,用程序员的sql去维护表之间的约束"这种看起来可行,但出错率高看起来很蠢的方法吧?
内容很多很绕口,感谢看完的你们,希望懂得人能回答一下,我是真的被百度的神人们给弄晕了,感激不尽!

6个回答

你要明白连接查询(inner,left,right)是不用定义外键也可以查询的)是不用定义外键也可以查询的
比如表teacher(int tid, varchar tname,varchar)
student(int sid,varchar sname,int tid)
我可以用连接查询查出教师表的信息。 select * from teacher t inner jion student s on t.tid=s.tid
这样关联虽然可以 查出数据,但是对于数据的改动没有任何约束。你去网上找的说不用外键也可以关联是正确的,但是他们话说少了, 两个之间的区别在于能否保持数据的一致性。
比如我使用上面的两张表我使用了外键关联。当我的教师在学生表还有对应信息的时候,我会阻止你删除这条教师的记录(你删了我这个学生找谁教啊是吧!!!)
但是我不用外键关联,我就可以随便删,该学生在教师表关联的数据为空。
其实这两者你也不用太纠结,你可以想象一下,定义外键有了数据去进行关系的确定。保证数据的稳定性。(对于一些完整性十分重要的数据可以定义)。而不用外键关联的连接查询,它说白了就是在查询的时候在去两张表中找对应的关联关系(如上,它去找s.tid=t.tid )从而确定关系
外键就是先将关联关系我给你定好了,你查询的时候也不用去找关联关系了,(所以查询的速度提升。而且数据完整,你要删除它已经确定关系的情人数据库就会阻止你,报有外键约束,除非你把他们的关系解除后才可以删除一方的信息)
上面我已经说了外键的好处,以及他与普通的连接查询的区别了。
现在我说说使用外键的代价:因为关系的绑定,在我确实需要删除那个对象的时候。我先要找到他关联的对象,接着解绑外键关联,再进行删除。
在实际使用维护比较困难,但是他能保证数据完整,防止误删。

你的纠结的论点:hibernate的关联可以代替数据库外键进行约束。
是错的。。。。 其实hibernate 提供的级联可以看作普通的关联查询,那他是怎么样确定他们的关联关系呢???
在你配置配置文件的时候,你需要指定一个对象的属性绑定另一个对象,或者是一个集合,这就是我们自已给他确定关联关系,相当于
inner jion student s on t.tid=s.tid
但是你说这种关联可以代替外键那是不可能的,我们确定只是关联关系,以便hibernate 可以进行连接查询,但是我并没有让你保持数据的完整性。(除非你在数据定义好了外键)
总结:其实你搞清楚外键关联查询和 普通的连接查询的区别你就可以理解了,然后在看看nibernate 级联查询的时候发出的查询sql是怎么样的,你就会明白了

u011461064
noMathNoPain 谢谢耐心解答 十分抱歉没有及时采纳 关于这个问题再回头看是我把平时的习惯当成了标准 没有区别开外键的作用和做查询时用的区别 多谢细心解答
接近 3 年之前 回复
Xu_Renata
Xu_Renata 回答得太好了!
3 年多之前 回复

确实,一般不用数据库的关联,特别是我们实际项目需要用到伪删除,数据库的关联和级联删除显得很麻烦。

hibernate关联配置并不能取代外键关联,外键关联是一个表的字段对另一个表的字段进行约束,避免数据冗余的,你如果仅仅从hibernate中关联,在数据库后台插入数据的时候是不会读所谓的hibernate的,所以如果不设置约束,还是会造成数据冗余,所以从这一方面来讲,外键不能被代替

个人认为,hibernate关联配置按实际需求情况确定,没有关联的说明自己功能用不到关联,但是当大量的业务需求的时候,为了减少数据冗余,表与表之间的关联必须存在的。楼上说的很对。

hibernate是4级封装,外键当然是在配置文件中配置咯,单独拿出来,你想干嘛?!!

1、Hibernate的关联配置注解肯定是建立在主外键关联的。可以试下,如果将hibernate的hibernate.hbm2ddl.auto配置none或validate,
然后将数据库结构更改与Hibernate的关联配置不一致。项目启动肯定会报错。
2、因为大多数开发的时候喜欢使用hibernate.hbm2ddl.auto的update,那么表结构会随着代码运行会自动更新,所以很多人误认为不需要关联。
使用Hibernate的大多同学可能对sql不是很精通,Hibernate使用估计也是停留在浅层,没有对hibernate的机制有所了解,所以产生的误会。

总结,虽然我也不是很精通hibernate,但是我的实践经验告诉我,hibernate开发的时候可以使用update,正式上线最好none或validate,
这样运行过程中比较容易发现问题。而数据库创建呢,还是通过sql脚本创建。这样在部署过程中比较规范。
以上观点如有异议,请提出互相学习,谢谢。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问