首页 > 解决方案 > 为什么hibernate在更新实体之前检索列表

问题描述

以下是映射

A.class里面

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, 
orphanRemoval = true, mappedBy = "aObj")
private List<B> listB;

B.class里面

@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
@JoinColumn(name = "a_id")
private A aObj;

我有 2 个实体 A 和 B。实体 A 包含 List 作为@OneToMany 关系,B 包含对 A 的引用作为双向一对多关系。插入操作工作正常但是当我尝试更新记录时。

A a = repository.findById(1);
a.setName("Test Name");
repository.save(a);

这里的问题是休眠执行一个额外的全选查询来检索列表。

顺序如下

Hibernate: select query for A
Hibernate: select all query for B
Hibernate: update query for A

现在为什么选择所有查询对 B 来说很重要,我已经在两端定义了延迟获取策略。

标签: hibernatespring-bootspring-data-jparelationshiphibernate-mapping

解决方案


你需要使用:

@OneToMany(mappedBy = "{your_var}", fetch = FetchType.LAZY)
private List<B> list;

如果您使用级联,请注意:

@OneToMany(cascade = {Cascade.PERSIST}, orphanRemoval = true)
private List<B> list;

此属性充当多米诺骨牌效应,并尝试在列表不为空的情况下保留或更新列表对象,我认为在这种情况下这不是您的方法,所以不要使用它


推荐阅读