Spring Boot JPA多对多关系-Rest Web Service无法返回子对象

Posted

技术标签:

【中文标题】Spring Boot JPA多对多关系-Rest Web Service无法返回子对象【英文标题】:SpringBoot JPA Many-to-Many relationship - Rest Webservice unable to return child objects 【发布时间】:2018-06-11 07:41:44 【问题描述】:

在使用 JPA 从 Spring Boot 应用程序中检索数据以处理多对多关系时,我需要帮助。我无法获取父实体的子实体。

我建立了一个简单的多对多关系:所有者 书 出版商

当我在控制器上执行 GET 以获取有关 Book 的数据时,我只获取 Book 的属性。不返回有关关联的所有者或发布者的信息。我错过了什么?

执行cURL -XGET http://localhost:8080/books只返回书的属性而不是依赖对象:

[
   
      "id":1,
      "name":"Book 1",
      "isbn":"978-0743246261"
   ,
   
      "id":2,
      "name":"Book 2",
      "isbn":"978-0743246262"
   ,
   
      "id":3,
      "name":"Book 3",
      "isbn":"978-0743246263"
   ,
   
      "id":4,
      "name":"Book 4",
      "isbn":"978-0743246264"
   
]

我已经在 GitHub 中设置了项目,它可以立即运行和测试:https://github.com/tekpartner/learn-spring-boot-many-2-many

【问题讨论】:

【参考方案1】:

@bhushan-uniyal 上面指出的解决方案是交换引用 JsonManagedReference 和 JsonBackReference,它起作用了。推送代码,它工作了。

【讨论】:

【参考方案2】:

默认情况下,使用策略lazy的多对多关系获取,意味着除非你不调用该方法从主对象中检索多对多关系对象,否则休眠将不会加载它们来自数据库。

请设置获取策略 EAGER 以便休眠将在加载主对象期间加载 many2many 关系

fetch=FetchType.EAGER

示例代码:

@ManyToMany(mappedBy = "userGroups", fetch = FetchType.EAGER)
private Set<User> users = new HashSet<User>();

【讨论】:

感谢您的提示。然而,这并没有帮助。请查看我的更新代码:github.com/tekpartner/learn-spring-boot-many-2-many 当我运行您的应用程序时,收到 2018-01-01 23:25:51.574 WARN 1557 --- [nio-8080-exec-1] .cjMappingJackson2HttpMessageConverter:无法评估 Jackson 序列化类型 [class net.tekpartner.learn.many2many.persistence.model.Book]:com.fasterxml.jackson.databind.JsonMappingException:net.tekpartner.learn.many2many.persistence.model.Book 的无效对象 ID 定义:找不到属性在命中 api localhost:8080/books/isbn/978-0743246264 期间使用名称“id” 这很奇怪。我已经删除了 Jackson 依赖项,因为它可以正常工作。我现在放回去了。请获取最新信息。 我拉了,但现在它抛出 Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class net.tekpartner.learn.many2many.persistence .model.Book 我将代码拉到新机器上并再次尝试。它对我有用。我想知道为什么它不适合你。

以上是关于Spring Boot JPA多对多关系-Rest Web Service无法返回子对象的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot JPA无限循环多对多

Spring boot JPA - 使用额外的列查询多对多

多对多 Spring Boot JPA 未填充多对多表

*** 错误设置多对多关系 Spring JPA

Spring数据JPA-休眠多对多关系在链接实体表中插入null

Spring,JPA:如何使用多对多关系桥表设置查询另一个实体下的实体