我正在尝试找到一种创建两个对象(作者和书籍)的解决方案,它们之间可以具有双向关系。我的意思是当我尝试获取所有书籍时:
{
"id":1,
"title":"Book Name",
"author":{
"id":1,
"name":"Author Name",
"books":???Here the books listed maybe???
}
}
之后,当我尝试获取所有作者时:
{
"id":1,
"name":"Author Name",
"books":[{
"id":1,
"title":"Book Name",
"author":???Here the author listed maybe???
}]
}
没有他们进入循环关系导致
java.lang.StackOverflowError
列出书籍时,我希望至少看到书籍作者姓名,列出作者时,我希望至少看到书籍 ID 或书籍标题,但始终将双方链接起来。
到目前为止我所做的是: 图书实体:
@Entity
@Data
@Table(name = "books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "author_id")
@JsonBackReference
private Author author;
}
作者单位:
@Entity
@Data
@Table(name = "authors")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "author", cascade = CascadeType.ALL)
@JsonManagedReference
private Set<Book> books = new HashSet<>();
}
预订DTO:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BookDTO {
private Integer id;
private String title;
private AuthorDTO author;
}
作者DTO:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AuthorDTO {
private Integer id;
private String name;
private Set<BookDTO> books = new HashSet<>();
}
BookService创建书籍方法:
@Override
public BookDTO createBook(BookDTO bookDTO){
Book newBook = modelMapper.map(bookDTO, Book.class);
returnBook = bookRepository.save(newBook);
return modelMapper.map(returnBook, BookDTO.class);
}
我已经阅读了很多关于@JsonManagedReference和@JsonBackReference、@JsonIgnore等的方法,但是我对我的目的感到困惑,其中哪一个是合适的,所以我不会忽略任何一方......
您的实体类不需要 @JsonManagedReference 和 @JsonBackReference、@JsonIgnore,因为您没有反序列化它们。
您可以配置 modelMapper 以避免循环引用。看看这个答案和modelMapper的配置文档。