多对多映射方法有啥区别
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 中使用普通整数,并且似乎是正确的解决方案。
我认为第一种方法可以修改为与第二种方法类似,但我现在无法做到。
我会将任何提供“为什么”这样的见解的答案标记为解决方案。
【讨论】:
以上是关于多对多映射方法有啥区别的主要内容,如果未能解决你的问题,请参考以下文章