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

时间:2019-07-08 11:49:54

标签: spring orm spring-data-jpa spring-rest spring-hateoas

我希望使用显式联接表进行多对多关系映射。

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

第一个问题/问题:

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

  1. 按照Vlad的建议在联接表中使用可嵌入的复合键? 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/

第二个问题: 在我的案例中,当在原始存储库中提供HAL格式时,需要哪种方法可以轻松地对关联进行建模并使魔力粉发挥作用。我的意思是关系的链接将自动生成。

1 个答案:

答案 0 :(得分:0)

要使many2many关联与spring数据其余部分很好地配合并为HAL表示提供正确的内容,您首先需要了解一些JPA / Hibernate。有两种方法(第一种和第二种是问题,第三种只是第二种的快捷方式,并且只能在Hibernate中使用。)

两种方法均以概念证明repository in tags branch的形式展示。我使用给定的存储库来测试项目的各种设置。

方法1,EmbeddedId 。它确实在BackendIdConverter Bean的FixConfig类中使用了骇人的东西,当它将来自URL的请求ID解析为可嵌入的ID类时,会使用bookRepository获取Book实体。

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

我认为可以将第一种方法修改为与第二种方法类似的方法,但是我暂时无法做到。

我会将任何答案标记为解决方案,以便对“为什么”这样的情况提供一些见识。