我在数据库中有表Authors和Books(带有连接表Authorsbooks)。我使用
MySQL
创建并启动了表格。我还与两个实体 Authors 和 Books 进行了(标准)JPA
映射,在一个实体中使用 @manyToMany
和 @Jointable
,在另一个实体中使用 mappedBy
并将其连接到数据库。
当我尝试使用 Java 方法 findAll()
获取
Authors实体的所有成员时,它返回一个无穷无尽的序列:就像作者的第一个成员和书籍列表,其中第一个 Book 包含 Authors 的列表它包含第一本书,其中包含作者列表等等,无穷无尽。如何只获得没有字段 listOfBooks 的作者(就像我在数据库表中有它一样)?
@Entity
公开课作者{
@Id
@GeneratedValue
@Column(name = "authorid")
private Integer authorid;
@Column(name = "authorname")
private String authorname;
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "listOfAuthors")
private List<Book> listOfBooks = new ArrayList<Book>();
//getters and setters
@Entity
公开课书{
@Id
@GeneratedValue
@Column(name = "bookid")
private Integer bookid;
@Column(name = "bookname")
private String bookname;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "author2books", joinColumns = @JoinColumn(name = "bookid"),
inverseJoinColumns = @JoinColumn(name = "authorid"))
private List<Author> listOfAuthors = new ArrayList<Author>();
//getters and setters
@RestController
@RequestMapping(value = "/rest/authors") 公共类 AuthorResource {
@Autowired
AuthorsRepository authorsRepository;
@GetMapping(value = "/all")
public List<Author> getAll() {
return authorsRepository.findAll();
}
}
CREATE TABLE author
( authorid INT AUTO_INCREMENT 主键, 作者姓名 VARCHAR(255) NOT NULL );
创建表格书 ( bookid INT AUTO_INCREMENT 主键, 书名 VARCHAR(255) NOT NULL );
创建表 author2books ( 授权 INT, bookid INT,
PRIMARY KEY (authorid, bookid), 外键 (authorid) 参考作者 (authorid), 外键 (bookid) 参考书籍 (bookid) );
-- 创建作者值 INSERT INTO Author VALUES (authorid, 'Sven'); 插入作者值(authorid,'Peter');
-- 创建 Book 值 INSERT INTO Book VALUES (bookid, 'Biology'); INSERT INTO Book VALUES (bookid, 'Chemistry');
-- 创建 author2books 值
插入 author2books VALUES (1, 2);
我很惊讶在我看来标准情况下很难找到解决方案。我找到了两种解决方法。 第一个有点间接:在不包括 ManytoMany 列表字段的情况下进行查询返回实体,如下所述:Spring JPA 选择特定列。 第二种方法更直接但看起来很奇特:使用 JsonBackReference 和 JsonManagedReference 注释,如下所示:https://www.keenformatics.com/how-to-solve-json-infinite-recursion/
可以尝试标记关系 Book -> author / Author -> book Lazy loaded 避免进入死循环:)
@ManyToMany(获取 = LAZY)