多对多映射方法有什么区别
What are differences in many to many mapping approach
我想要具有显式连接的多对多关系映射 table。
我的 java spring 项目以 HAL 格式提供 REST api,现在它只有两种分类:
- 定义的实体和
- "empty" 存储库接口(由@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
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 对多对多关系进行建模(以便能够对我的关联需求进行建模),但我不知道它们之间的区别。 这些方法有什么区别?:
- 按照 Vlad 的建议在连接 table 中使用可嵌入的复合键? https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/
- 使用@IdClass 方法,如下所述:
- 在联接 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" 提供一些见解的答案标记为解决方案。
我想要具有显式连接的多对多关系映射 table。
我的 java spring 项目以 HAL 格式提供 REST api,现在它只有两种分类:
- 定义的实体和
- "empty" 存储库接口(由@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
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 对多对多关系进行建模(以便能够对我的关联需求进行建模),但我不知道它们之间的区别。 这些方法有什么区别?:
- 按照 Vlad 的建议在连接 table 中使用可嵌入的复合键? https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/
- 使用@IdClass 方法,如下所述:
- 在联接 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" 提供一些见解的答案标记为解决方案。