SpringJpa中ManyToMany、ManyToOne导致的死循环(java.lang.StackOverflowError)两种解决办法

方法一:

采用@JsonIgnore注解
具体位置如下:

@Entity
@Setter
@Getter
public class BookCategory implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long categoryId;

    @Column(nullable = false, unique = true)
    private String categoryName;

    @JsonIgnore  //在一的一方加的
    @OneToMany(mappedBy = "bookCategoryName", fetch = FetchType.EAGER)
    private Set<Book> categoryBooks= new HashSet<>();
}

多的一方代码:

public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bookId;

    @Column(nullable = false)
    private String bookName;

    @Column(nullable = false)
    private String bookAuthor;

    @Column(nullable = false)
    private String bookPublisher;

    @Column(nullable = false, insertable = false, columnDefinition = "tinyint(1) comment '书籍是否还在书架上'")
    private byte bookStatus;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, targetEntity = BookCategory.class)
    @JoinColumn(name = "book_category_name", referencedColumnName = "categoryName")
    private BookCategory bookCategoryName;

    //columnDefinition前面必须先指定类型,才能添加注释,直接添加注释会出错
    @Column(nullable = true, columnDefinition = "date comment '登记日期'")
    private LocalDate bookRecord;
}

@JsonIgnore注解并不是简单的字面意思那样,不返回被注解的值。从目前我掌握的知识以及结果来看,他或许真的就是简单的破坏了那个循环链。

查询的结果如下:
在这里插入图片描述

方法二:

不知道从上面的返回结果来看,你们发现了什么秘密没有。
那就是,book字段中的private BookCategory bookCategoryName,返回的竟然是BookCategory对象中的所有字段。在我们的想象中,我们应该想要的只是BookCategory中的categoryName这个字段的值,但他返回的竟然是一个对象,不符合我们的需求,而且这也是导致循环调用的的元凶

明白了上面的那段话,那么解决问题的方式就很简单了。

只要改变private BookCategory bookCategoryName;这个字段的getter方法,让他返回我们关心的字段就可以了。类似的什么去掉toString()方法也是没必要的,只需要在其中改变打印的private BookCategory bookCategoryName;内容即可,还是只让他打印我们关心的内容而不是这个对象。

修改代码如下:

把这段代码:

public BookCategory getBookCategoryName() {
        return bookCategoryName;
    }

修改成

public String getBookCategoryName() {
        return bookCategoryName.getCategoryName();
	}

总结

  1. 如果想省事,使用@JsonIgnore注解
  2. 如果想在后台直接把数据格式整理好,就使用第二种方法。
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值