我在数据库中有表作者和图书(带有连接表 Authorsbooks )。我使用MySQL
创建并启动了表格。我还在一个实体中使用JPA
和@manyToMany
以及另一个实体中的@Jointable
与两个实体作者和书籍进行了(标准)mappedBy
映射,并将其连接到数据库。
当我尝试使用带有方法findAll()
的Java获取作者实体的所有成员时,它返回一个无穷无尽的序列:就像第一个带有书籍列表的作者的成员,其中第一个 Book 包含作者的列表,其中包含第一本书,其中包含作者列表等等,无穷无尽。如何只获得没有字段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 PRIMARY KEY, authorname VARCHAR(255)NOT NULL );
CREATE TABLE Book ( bookid INT AUTO_INCREMENT PRIMARY KEY, bookname VARCHAR(255)NOT NULL );
CREATE TABLE author2books ( authorid INT, bookid INT,
PRIMARY KEY(authorid,bookid), FOREIGN KEY(authorid)REFERENCES作者(authorid), 外键(bookid)参考书(bookid) );
- 创建作者值 插入作者价值观(authorid,'Sven'); 插入作者价值观(作者,'彼得');
- 创建图书价值 插入书籍价值(bookid,'生物学'); 插入书籍价值(bookid,'化学');
- 创建author2books值
INSERT INTO author2books VALUES(1,2);
答案 0 :(得分:0)
您可以尝试标记关系Book - &gt;作者/作者 - &gt; book Lazy加载以避免进入无限循环:)
@ManyToMany(fetch = LAZY)
答案 1 :(得分:0)
我很惊讶在我看来标准情况下找不到解决办法很容易。我找到了两种解决方法。 第一个是间接的:使查询返回实体而不包括ManytoMany列表字段,如下所述:Spring JPA selecting specific columns。 第二种方式更直接,但看起来很奇特:使用JsonBackReference和JsonManagedReference注释,如:keenformatics.blogspot.se/2013/08 /