首页 > 解决方案 > 多对多映射方法有什么区别

问题描述

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

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

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

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。查看示例 hal+json文档并查找ea:basket示例。)按预期工作并且它“免费”工作,因为弹簧自动配置和包括其他魔法。

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

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

第一个问题/问题:

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

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

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

标签: springormspring-data-jpaspring-restspring-hateoas

解决方案


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

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

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

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

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

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


推荐阅读