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

查询的结果如下:
SpringJpa中ManyToMany、ManyToOne导致的死循环(java.lang.StackOverflowError)两种解决办法_第1张图片

方法二:

不知道从上面的返回结果来看,你们发现了什么秘密没有。
那就是,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. 如果想在后台直接把数据格式整理好,就使用第二种方法。

你可能感兴趣的:(Spring-Bug)