当前位置: 首页 > 面试题库 >

为什么建议避免在外键上进行单向一对多关联?

商同化
2023-03-14
问题内容

在Hibernate联机文档中,在7.2.3节“一对多”下提到:

外键上的单向一对多关联是一种不常见的情况,因此不建议这样做。您应该使用联接表进行这种关联。

我想知道为什么?我唯一想到的是,它可能会在级联删除期间产生问题。例如,“人”是指外键上一对多关系上的地址,并且该地址将拒绝在该人之前被删除。

任何人都可以解释该建议背后的合理性吗?

这是参考文档内容的链接:7.2.3。一对多

我已将实际内容复制粘贴到此处:

外键上的单向一对多关联是一种不常见的情况,因此不建议这样做。

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <set name="addresses">
        <key column="personId"
            not-null="true"/>
        <one-to-many class="Address"/>
    </set>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
</class>
create table Person (personId bigint not null primary key)
create table Address (addressId bigint not null primary key, personId

bigint not null)

您应该使用联接表进行这种关联。


问题答案:

外键上的单向一对多关联是一种不常见的情况,因此不建议这样做。

这有两个方面:

  • 单向
  • 一对多

该线程
@CalmStorm 的答案被删除的链接地址只有这些东西的第二位,但让我们开始吧。

该线程建议用联接表替换一对多关系,因为否则,一对多方法“用不属于该实体的列填充许多副表,仅用于“链接” porpuses(原文如此)
‘。这种策略可能会在Hibernate层中产生干净的模型,但不幸的是,这会导致数据库损坏。

因为SQL只能断言子记录有一个父记录;没有办法强制父母必须有孩子的规则。因此,没有办法坚持要求表在联接表中具有条目,结果是有可能具有孤立的子记录,这正是外键旨在防止的。

我还有其他一些反对意见,但下一个最重要的反对意见是不适当。相交表旨在表示多对多关系。用它们表示一对多的关系会造成混乱,并且我喜欢过多的其他数据库对象。

因此,第二个方面是: 单向
一对多关联。这些问题是Hibernate默认情况下处理它们的特殊方式。如果我们在同一事务中插入一个父项和一个子项,则Hibernate插入子项记录,然后插入父项,然后使用父项的键更新子项。这需要可延期的外键约束(yuck!),也可能需要不可延期的非null约束(double
yuck)。

有两个解决方法。一种是使用双向的一对多关联。根据文档中的引用,这是最常见的方法。另一种方法是调整子对象的映射,但这有其自身的影响。



 类似资料:
  • 问题内容: 在Hibernate在线文档中,在7.2.3节“一对多”中提到: 外键上的单向一对多关联是一种不常见的情况,因此不建议这样做。您应该使用联接表进行这种关联。 我想知道为什么?我唯一想到的是,它可能会在级联删除期间产生问题。例如,“人”是指外键上一对多关系上的地址,并且该地址将拒绝在该人之前被删除。 谁能解释建议背后的合理性? 以下是参考文档内容的链接:7.2.3。一对多 我已将实际内容

  • 我使用的是PlayFramework 2.3,我有以下类: MyEntity.java: Version.java 当我想为实体创建一个新版本时,我通过分离复制它,将id设置为0,并按如下方式持久化: 如果我使用下面的代码,它工作正常(第一个代码) 我不太喜欢这个代码,因为我可以像这样使用它(第二个代码) 但如果我这样做,外键不会在“实体”表中更新,我不知道为什么。有人能告诉我克隆的两种实现方式有

  • 问题内容: 在本文档中(向下滚动至“单向”部分): http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity- mapping-association- collections 它说,与联接表进行单向一对多关联比仅在拥有实体中使用外键列更可取。我的问题是,为什么它更受欢迎? 问题答案: 考

  • 问题内容: 我有两个非常简单的对象,并且一个对象应在一组“一对多”关系中包含另一个对象。对象已正确插入数据库中,但“子项”表中的外键始终为“ null”。 我不知道为什么: 这是测试对象,它将子对象保持在其集合中: 这是子对象,它包含指向“ TestObj”的反向链接: 我使用以下代码来持久化此对象: 有人可以解释一下为什么会这样吗? 问题答案: 这很简单:您永远不会初始化中的字段(应将其命名为C

  • 但是,我似乎搞错了一些事情,因为当Hibernate创建表时,会创建多个外键,如下所示: 信息:HHH10001501:从JdbcConnectionAccess[org.hibernate.engine.jdbc.env.internal.jdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@5E5595F3]获得的用于(

  • 问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之