我有以下问题。我是新的Spring。我已经创建了2个实体,现在使用 Postman 我想得到所有的书籍,但我一直得到StackOverflowError。
这是书本模型
package com.example.demo;
import jakarta.persistence.*;
import java.util.List;
@Entity
public class BookEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String title;
@ManyToMany
private List<Author> author;
public BookEntity() {
}
public BookEntity(String title) {
this.title = title;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<Author> getAuthor() {
return author;
}
public void setAuthor(List<Author> author) {
this.author = author;
}
}
作者类模型
package com.example.demo;
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
@ManyToMany
private List<BookEntity> book;
public Author() {
}
public Author(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<BookEntity> getBook() {
return book;
}
public void setBook(List<BookEntity> book) {
this.book = book;
}
}
藏书室
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookRepository extends JpaRepository<BookEntity, Long> {
}
作者存储库
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface AuthorRepository extends JpaRepository<Author, Long> {
}
图书控制器
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/books")
public class BookController {
private final AuthorRepository authorRepository;
private final BookRepository bookRepository;
public BookController(AuthorRepository authorRepository, BookRepository bookRepository) {
this.authorRepository = authorRepository;
this.bookRepository = bookRepository;
}
@GetMapping
List<BookEntity> getAllBooks() {
return bookRepository.findAll();
}
}
你能解释一下发生了什么事吗?我不能再往前走了.我被卡住了
1条答案
按热度按时间2ledvvac1#
这是一个常见的问题,问题是Book和Author的关系是
ManyToMany
,所以现在每当你访问Books时,它们都有一个Author字段,当Jackson试图添加Author时,结果发现Author中的Books也有一个Author。我知道有两种方法可以解决这个问题,第一种是DTO,你应该创建一个类,让你的控制器显示出来,看起来像这样:
情况有点复杂,因为多对多,所以您需要另一个DTO的作者
你可以使用一个服务层来完成所有的Map。2然后你应该在你的控制器中返回BookDTO。
另一种解决方法是注解:
以及
@JsoonManaged和back References将阻止Jackson挖掘另一个实体。
另一件事是,您应该考虑在您的实体之一
mappedBy
,以防止创建2个表。