OneToMany 和 ManyToMany 单向关系的区别

Posted

技术标签:

【中文标题】OneToMany 和 ManyToMany 单向关系的区别【英文标题】:Difference between OneToMany and ManyToMany unidirectional relationships 【发布时间】:2014-08-11 12:12:15 【问题描述】:

是否有区别,因为我没有看到。如果没有双向关系,模型如何知道存在多对多。假设用户有电话,电话可以给多个用户。如果在 User 实体中描述了 ManyToMany 的单向关系,那么电话实体与在 User 中再次描述的 OneToMany 单向关系有何不同。

是否有必要对关系进行准确描述,以便一切按预期工作。我曾将 OneToMany 关系描述为 OneToOne,并且该模型仍然有效。

【问题讨论】:

【参考方案1】:

单向 OneToMany 可以使用连接列或连接表。如果是连接列,那么目标实体中有一个只能引用单个实体的外键。如果您选择连接表,则可以生成 DDL,以便添加约束以使目标实体的外键唯一,从而强制执行严格的 1:M 关系。但他们不必这样做。从 JPA 的角度来看,在 OneToMany 上使用连接表使其行为与 ManyToMany 几乎完全相同。

至于将 OneToMany 映射为 OneToOne - 这取决于您的意思。如果您的 OneToMany 关系是基于目标实体表中存在的外键,那么它在逻辑上是数据库中的 OneToOne 以另一种方式。唯一的区别是,在构建源实体时,JPA 在构建关系时只需要一个目标实体。因此,如果目标中的外键不是唯一的(即有很多匹配的),则可能只有第一个被拉出并放置在关系中——因此关系状态将与实际的数据库数据不匹配。当您尝试直接操作关系或从其他上下文合并时,这会给您带来问题,因为它可能以不同的方式填充。

【讨论】:

我不知道没有连接表的情况下单向关系是可能的,我搜索并找到了这个链接:en.wikibooks.org/wiki/Java_Persistence/… 所以我的问题只是关于连接表的情况。谢谢你的回答

以上是关于OneToMany 和 ManyToMany 单向关系的区别的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine2 - 无法删除具有单向 oneToMany 关系的实体

Symfony2 项目中的 Doctrine2 映射问题

EclipseLink 如何使用两个@OneToMany 和@ManyToOne 来替换@ManyToMany

Jpa中ManyToMany和OneToMany的双向控制

Jpa中ManyToMany和OneToMany的双向控制

如何获取 @OneToMany 和 @ManyToMany 实体