查询报错:java.lang.StackOverflowError: null

java.lang.StackOverflowError: null

字面理解报错的原因是栈溢出。

我这里仅讲由于使用JPA导致的java.lang.StackOverflowError: null

例子:

清洁工实体

@Data
@Entity
@Table(name = "cms_cleaner")
public class Cleaner implements Serializable {

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "cms_cleaner_room",
            joinColumns = {@JoinColumn(name = "CLEANER_ID", referencedColumnName = "cleanerId")},
            inverseJoinColumns = {@JoinColumn(name = "ROOM_ID", referencedColumnName = "roomId")})
    private Set<Room> rooms = new HashSet<Room>();
    
}

课室实体

@Entity
@Table(name="Room")
@Data
@DynamicUpdate
public class Room implements Serializable {

    @JsonIgnore
    @ManyToMany(mappedBy = "rooms", fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    private Set<Cleaner> cleaners=new HashSet<Cleaner>();

}

原因:查询时产生了死循环或无限递归

输出一个room对象时,也会输出cleanerlist,因为是双向关联的,所以也会触发cleaner对象,接下来便是rooms。。。产生无限递归,导致栈溢出。

解决:

办法一

for(Room room : cleaner.getRoomList()){
      //提前终止,这样便不会产生无限递归
      room.setRoomList(null);
      System.out.println(role);

}

办法二

把双向的关联变为单向的关联。

即删除Room实体类中的:

 @JsonIgnore
    @ManyToMany(mappedBy = "rooms", fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    private Set<Cleaner> cleaners=new HashSet<Cleaner>();

办法三

将两个实体类中的@ManyToMany均改成@OneToMany。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值