使用一对多和多对多映射时的无限递归循环(双向)

问题描述 投票:0回答:1

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

UserBusinessReview

User.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;

[当我尝试通过存储库查找具有business_id的业务时,我得到了一个无限的递归Json列表。我必须找到具有user_id的User,但是也会发生同样的事情。

任何帮助将不胜感激

注意:我已经按照答案中的说明使用了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"])
hibernate spring-boot spring-data-jpa hibernate-mapping
1个回答
0
投票

在这种情况下,用户与审阅之间存在一对多关系,而审阅也与用户之间存在许多关系。因此,每当您检索User时,您都会获得Reviews列表,而后者又是user,导致这是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删除此对象以避免递归。

© www.soinside.com 2019 - 2024. All rights reserved.