【发布时间】:2020-08-05 15:19:09
【问题描述】:
下面是映射
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 来说很重要 我在两端都定义了惰性获取策略。
【问题讨论】:
-
请发布映射
-
请看一下。我已经更新了
-
我会尝试移除级联
-
尝试使用
cascade = {CascadeType.PERSIST, CascadeType.REMOVE}而不是cascade = CascadeType.ALL -
我发现了问题所在。除了 OneToMany 我还使用 Size 进行验证,这导致了这个额外的选择查询。我的清单如下。 NotNull(message = "列表不能为空") Size(min = 2, message = "列表大小应为 2") OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "aObj") private List listB .. 有什么解决办法吗?没有 Size 注释它工作正常;
标签: hibernate spring-boot spring-data-jpa relationship hibernate-mapping