多对多映射方法有啥区别

Posted

技术标签:

【中文标题】多对多映射方法有啥区别【英文标题】:What are differences in many to many mapping approach多对多映射方法有什么区别 【发布时间】:2019-07-08 11:49:54 【问题描述】:

我想要带有显式连接表的多对多关系映射。

我的 java spring 项目正在提供 HAL 格式的 REST api,现在它只有两种类型的分类:

实体定义和 存储库的“空”接口(由@RepositoryRestResource 注释)。

旁注,依赖关系大约是这些:

spring-boot-starter-parent
spring-boot-starter-data-jpa
spring-boot-starter-data-rest
spring-data-rest-hal-browser
postgresql / h2
spring-boot-starter-hateoas

表之间的关系(我的意思是休息资源的 _links。例如,查看sample hal+json 文档并查找ea:basket。)按预期工作并且它正在“免费”工作,因为魔术粉来自包括弹簧自动配置和其他魔法。

在添加新的多对多依赖项时,我现在正在苦苦挣扎。

我有实体 A、B 和标签。我想让任意数量的 Tag 实体与 A 和 B 实体相关联。我不需要在 A 和 B 实体中有任何列表/设置(如果我需要的不仅仅是 crud,我会使用 jooq)。

第一个问题/问题:

我看到至少三种使用显式连接表建模多对多关系的方法(以便能够建模我的关联需求),但我不知道差异。 这些方法有什么区别?

    按照 Vlad 的建议在连接表中使用可嵌入的复合键? https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/ 使用@IdClass 方法,如下所述:https://***.com/a/3588400/11152683 在连接表中使用多个@Id,如下所示:https://hellokoding.com/jpa-many-to-many-extra-columns-relationship-mapping-example-with-spring-boot-hsql/

第二个问题: 在我的案例中,当在 crud 存储库中提供 HAL 格式时,需要什么方法来轻松建模关联并让魔法粉发挥作用。我的意思是关系的链接会自动生成。

【问题讨论】:

3 只是 2 的替代品,并且受 Hibernate 支持,但不是 JPA 规范的一部分。 ***.com/questions/19813372/… 【参考方案1】:

要使 many2many 关联与 spring 数据休息的东西很好地工作并为 HAL 表示提供正确的东西,你首先要了解一点 JPA/Hibernate。有两种方法(问题中的 1 和 2,因为第三种方法只是第二种方法的快捷方式,并且只能在 Hibernate 中工作。)。

这两种方法都显示在概念证明repository in tags branch 中。我使用给定的存储库来测试项目的各种设置。

方法 1,EmbeddedId。它确实在 BackendIdConverter bean 的 FixConfig 类中使用了骇人听闻的东西,当它将请求 id 从 url 解析到可嵌入的 id 类时,它使用 bookRepository 来获取 Book 实体。

方法 2,IdClass。它在其 IdClass 中使用普通整数,并且似乎是正确的解决方案。

我认为第一种方法可以修改为与第二种方法类似,但我现在无法做到。

我会将任何提供“为什么”这样的见解的答案标记为解决方案。

【讨论】:

以上是关于多对多映射方法有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

mysql 多对多映射关系的筛选SQL怎么写

MyBatis注解开发之多对多查询

hibernate 表关系映射详解之多对多

Hibernate学习笔记 — 多对多关系映射

Hibernate映射( 多对一对一对多多对多)的配置方法

Hibernate多对多关系映射(建表)