Spring Boot 两个对象@OneToMany 和 @ManyToOne 之间的双向关系

问题描述 投票:0回答:1

我正在尝试找到一种创建两个对象(作者和书籍)的解决方案,它们之间可以具有双向关系。我的意思是当我尝试获取所有书籍时:

{
"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等的方法,但是我对我的目的感到困惑,其中哪一个是合适的,所以我不会忽略任何一方......

spring-boot hibernate jpa entity bidirectional
1个回答
0
投票

您的实体类不需要 @JsonManagedReference@JsonBackReference@JsonIgnore,因为您没有反序列化它们。

您可以配置 modelMapper 以避免循环引用。看看这个答案modelMapper的配置文档

© www.soinside.com 2019 - 2024. All rights reserved.