如何获取与JPA映射的其他实体具有manyToMany关系的实体成员列表?

时间:2018-01-12 17:25:34

标签: java mysql spring spring-data-jpa

我在数据库中有表作者图书(带有连接表 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);

Entities mapping schema

Tables creation SQL script

Entities mapping/relationship

Database script

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 /