【问题标题】:How to get a list of entity members which has manyToMany relationship with other entity mapped with JPA?如何获取与使用 JPA 映射的其他实体具有多对多关系的实体成员列表?
【发布时间】:2018-06-22 05:00:04
【问题描述】:

我在数据库中有表 AuthorsBooks(带有连接表 Authorsbooks)。我使用MySQL 创建并启动了表。我还使用@manyToMany@Jointable 在另一个实体中使用mappedBy 与两个实体作者和书籍进行(标准)JPA 映射,并将其连接到数据库。

当我尝试使用 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 PRIMARY KEY, 作者名 VARCHAR(255) NOT NULL );

创建表书 ( bookid INT AUTO_INCREMENT 主键, 书名 VARCHAR(255) NOT NULL );

创建表 author2books ( 授权INT, bookid INT,

PRIMARY KEY (authorid, bookid), FOREIGN KEY (authorid) REFERENCES 作者 (authorid), 外键 (bookid) 参考书 (bookid) );

-- 创建作者值 插入作者值(authorid,'Sven'); 插入作者值(authorid,'Peter');

-- 创建账面价值 插入图书价值(bookid,“生物学”); INSERT INTO Book VALUES (bookid, 'Chemistry');

-- 创建 author2books 值

INSERT INTO author2books VALUES (1, 2);

Entities mapping/relationship

Database script

【问题讨论】:

  • 可能想显示您的映射,然后我们可能会帮助您发现错误。
  • 您可能在访问Author 类型的集合后触发了延迟加载
  • 请不要将代码 sn-ps 发布为图像,而是发布为代码块(格式良好的文本)。
  • 如果您也可以在这里发布表格架构..
  • 你也可以看看这里..可能会有所帮助。 stackoverflow.com/questions/33234546/…

标签: java mysql spring spring-data-jpa


【解决方案1】:

我很惊讶在我认为的标准情况下找到解决方案并不容易。我找到了两种解决方法。 第一个有点间接:在不包括多对多列表字段的情况下创建查询返回实体,如下所述:Spring JPA selecting specific columns。 第二种方式更直接,但看起来很奇特:使用 JsonBackReference 和 JsonManagedReference 注释,如下所示:keenformatics.blogspot.se/2013/08/

【讨论】:

    【解决方案2】:

    你可以尝试标记关系书->作者/作者->书懒加载以避免进入无限循环:)

    @ManyToMany(fetch = LAZY)

    【讨论】:

    • 这可能是涉及集合的冗余 bcoz 实体关系默认是延迟加载的
    • 是的,你是对的。这是默认方式,但尝试一下不会有什么坏处吗?无论如何,他的映射似乎不是这里的问题。或者也许是..
    • 谢谢,我试过了:但没有改变:无限循环。
    • 在谷歌和 Stackoverflow 中搜索了很长时间的答案后,我找到了一个真正有用的答案。但我不知道这是否会产生副作用:使用 JsonBackReference 和 JsonManagedReference 注释,如下所示:keenformatics.blogspot.se/2013/08/…。也许还有另一种方式。我需要测试这些注释。
    猜你喜欢
    • 2018-01-13
    • 2013-08-18
    • 1970-01-01
    • 2019-02-13
    • 2018-04-29
    • 2021-05-25
    • 1970-01-01
    • 2015-10-03
    • 2023-03-05
    相关资源
    最近更新 更多