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

问题描述 投票:0回答:2

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

Entities mapping/relationship

Database script

java mysql spring spring-data-jpa
2个回答
1
投票

我很惊讶在我看来标准情况下很难找到解决方案。我找到了两种解决方法。 第一个有点间接:在不包括 ManytoMany 列表字段的情况下进行查询返回实体,如下所述:Spring JPA 选择特定列。 第二种方法更直接但看起来很奇特:使用 JsonBackReference 和 JsonManagedReference 注释,如下所示:https://www.keenformatics.com/how-to-solve-json-infinite-recursion/


0
投票

可以尝试标记关系 Book -> author / Author -> book Lazy loaded 避免进入死循环:)

@ManyToMany(获取 = LAZY)

© www.soinside.com 2019 - 2024. All rights reserved.