采用@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();
}
@JsonIgnore
注解