我在数据库中有表authors和图书(带有连接表authorsbooks)。我用 MySQL
. 我还制定了(标准) JPA
使用两个实体Map作者和书籍 @manyToMany
以及 @Jointable
在一个实体和 mappedBy
另一个连接到数据库。
当我尝试用java方法获取authors实体的所有成员时 findAll()
它返回一个无休止的序列:就像拥有图书列表的作者的第一个成员,其中第一本书包含作者列表,其中第一本书包含作者列表,依此类推,无休止。如何只获取作者而不包含图书列表字段(就像我在数据库表中有它一样)?
@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
(authord int auto\ u increment主键,authorname varchar(255)不为空);
创建表book(bookid int auto\ u increment主键,bookname varchar(255)不为空);
创建表author2books(authorid int,bookid int,
主键(authorid,bookid),外键(authorid)引用author(authorid),外键(bookid)引用book(bookid));
--创建作者值插入作者值(authord,'sven');插入作者值(authord,'peter');
--创建帐面价值插入帐面价值(bookid,'生物学');插入帐面价值(bookid,'化学');
--创建author2books值
插入author2books值(1,2);
实体Map/关系
数据库脚本
2条答案
按热度按时间toiithl61#
我感到惊讶的是,在我看来,要找到一个解决这个问题的办法并不容易。我找到了两种解决方法。第一种是有点间接的:使查询返回实体而不包括所描述的许多列表字段here:spring jpa 选择特定列。第二种方法更直接,但看起来很奇特:使用jsonbackreference和jsonmanagedreference注解,如下所示:keenformatics.blogspot.se/2013/08/
ztmd8pv52#
您可以尝试标记关系book->author/author->book lazy loaded,以避免进入无限循环:)
@manytomany(fetch=lazy)