@OneToMany 与休眠中的关联表

Posted

技术标签:

【中文标题】@OneToMany 与休眠中的关联表【英文标题】:@OneToMany with association table in hibernate 【发布时间】:2021-12-11 15:54:05 【问题描述】:

我正在学习关于休眠的课程。讲师讨论了一些关于数据库的事情。当我们有一个 1-N 关系,并且可选性为 0 时。最好有一个联结表以避免空值。只是这对我来说感觉不对,我希望有人解释一下。需要明确的是,这个话题基本上是关于冬眠的,我不确定这是否相关。

【问题讨论】:

【参考方案1】:

我认为一对多关系的关联表是一个不好的建议。

首先,避免空值的论点是错误的 - 如果您有父子关系,则将 FK 放在子表上。因此,如果子节点的数量为零,则根本没有 FK 指向父节点的记录 - 不会引入空值。

其次,与子表上的 FK 相比,建议的映射效率较低。见The best way to map a @OneToMany relationship with JPA and Hibernate:

对于 DBA,这看起来更像是多对多的数据库关联,而不是一对多的关系,而且效率也不高。我们现在有三个表,而不是两个表,因此我们使用了不必要的存储空间。我们现在有两个外键,而不是只有一个外键。然而,由于我们很可能要索引这些外键,我们将需要两倍的内存来缓存这个关联的索引。不好看!

同样,在14 High-Performance Java Persistence Tips 中,单向@OneToMany(Hibernate 使用关联表映射一对多的方式)被列为效率最低的关系之一。

最后,标题@JoinTable instead @OneToMany 具有误导性——@JoinTable 可用于配置单向@OneToMany 关系,它不能替代它。见JPA - Using @JoinTable in @OneToMany association:

@JoinTable 注解可以在关联中用于自定义生成的连接表或映射现有的连接表。在下面的示例中,我们将演示如何将此注解与@OneToMany 关联一起使用。

【讨论】:

以上是关于@OneToMany 与休眠中的关联表的主要内容,如果未能解决你的问题,请参考以下文章

休眠 OneToMany 和 ManyToOne?

使用带有 gilead 的注释通过 gwt 进行休眠时,我收到 oneToMany 关联错误

您如何在休眠条件中订购 oneToMany 连接表

非主键之间的休眠关系OneToMany

休眠 @OneToMany 没有单独的连接表

非冗余休眠列表映射 (OneToMany)