多对多映射方法有什么区别

What are differences in many to many mapping approach

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

我的 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

table 之间的关系(我的意思是 _links of rest resources。看看 sample hal+json 文档并寻找 ea:basket 例如。)正在按预期工作,它是工作 "for free",因为来自 spring 自动配置的魔法粉和其他魔法包括在内。

我现在在添加新的多对多依赖项时遇到困难。

我有实体 A、B 和 Tag。我希望有任意数量的 Tag 实体与 A 和 B 实体相关联。我不需要在 A 和 B 实体中有任何 list/set(如果我需要的不仅仅是 crud,我会使用 jooq)。

第一个problem/question:

我看到至少有三种方法可以通过显式连接 table 对多对多关系进行建模(以便能够对我的关联需求进行建模),但我不知道它们之间的区别。 这些方法有什么区别?:

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

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

为了让 many2many association 与 spring data rest things 很好地工作并为 HAL representation 提供正确的东西,你首先要了解一点 JPA/Hibernate。有两种方法(问题中的 1 和 2,因为第三种方法只是第二种方法的捷径,并且仅在 Hibernate 中工作。)。

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

方法一,EmbeddedId。它确实在 BackendIdConverter bean 的 FixConfig class 中使用了 hackish 东西,当它从 url 解析请求 id 到可嵌入 id class.

时,它使用 bookRepository 获取 Book 实体

方法 2,IdClass。它在其 IdClass 中使用纯整数,这似乎是正确的解决方案。

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

我会将任何为 "why" 提供一些见解的答案标记为解决方案。