使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)

Posted

技术标签:

【中文标题】使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)【英文标题】:Infinite Recursive Loop While Using OnetoMany and ManytoOne Mapping (Bidirectional) 【发布时间】:2020-09-04 16:50:04 【问题描述】:

在我的 Spring Boot Rest 应用程序中,我有三个模型类

User, Business, Review

用户.java

@OneToMany(cascade = CascadeType.ALL, mappedBy = "partner",fetch = 
 FetchType.LAZY)
private Set<Business> business;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="user")
private List<Review> reviews;

Business.java

@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="business")
private List<Review> reviews;

    @JoinTable(name = "business_service",
            joinColumns =  @JoinColumn(name = "business_id_fk") ,
            inverseJoinColumns =  @JoinColumn(name = "serviceIdFk") )
        private List<ServiceVO> services = new ArrayList<ServiceVO>();

Review.java

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "businsessIdFk")
private Business business;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "addedBy", nullable = false)
private User user;

当我尝试通过 Repository 查找具有 business_id 的业务时,我得到一个无限递归 Json 列表。 我必须找到带有 user_id 的用户,但也会发生同样的事情。

任何帮助将不胜感激

注意:我已经使用了答案中提到的 JsonIgnore。它给我带来了另一个杰克逊绑定错误

   com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No 
   serializer found for class 
   org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no 
   properties discovered to create BeanSerializer (to avoid exception, 
   disable 
   SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 
   com.ovoox.model.Business["services"]- 
  >org.hibernate.collection.internal.PersistentBag[0]- 
   com.ovoox.model.ServiceVO$HibernateProxy$
   TOMK9CML["hibernateLazyInitializer"])

【问题讨论】:

序列化时是否使用 ObjectMapper 实例? @Eric 请查看更新后的问题 @ustaad 请使用正确的包类 org.codehaus.jackson.annotate.JsonIgnore 这将解决问题。 spring.jackson.serialization.fail-on-empty-beans=false ,在你的属性文件中使用它。 【参考方案1】:

在这种情况下,用户通过一对多关系映射到评论,并且评论再次通过多对关系映射到用户。因此,每当您检索用户时,您都会获得评论列表,而评论列表又是用户,导致这是一个 JSON 无限递归。要摆脱这种情况,请尝试以下代码:

在 Review.java POJO

import org.codehaus.jackson.annotate.JsonIgnore;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "businsessIdFk")
private Business business;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "addedBy", nullable = false)
private User user;

@JsonIgnore
public Business getBusiness()
    return business;


@JsonIgnore
public User getUser()
    return user;

使用@JsonIgnore 删除此对象以避免递归。

【讨论】:

已经尝试过@JsonIgnore,但它给我带来了另一个错误 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class 试试 org.codehaus.jackson.annotate.JsonIgnore 这个类 你能分享你的整个班级定义吗? 相信我还有别的问题,这个问题我遇到过很多次,用JsonIgnore解决了。

以上是关于使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)的主要内容,如果未能解决你的问题,请参考以下文章

JPA、OneToMany 和 ManyToOne

加入表@OneToMany / @ManyToOne

使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)

无法使用 OneToMany 和 ManyToOne 关系在休眠中创建表(也无法创建外键)

使用 @OneToMany 和 @ManyToOne 注释是更新一个实体表,而不是许多表

休眠 OneToMany 和 ManyToOne?