noMathNoPain 2016-08-11 20:05 采纳率: 78.3%
浏览 3527
已采纳

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

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

  • 写回答

6条回答

  • 果冻剑客 2016-08-12 07:21
    关注

    你要明白连接查询(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是怎么样的,你就会明白了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?