【问题标题】:Why hibernate retrieves the list before updating the entity为什么hibernate在更新实体之前检索列表
【发布时间】: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


【解决方案1】:

你需要使用:

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

如果你正在使用级联,请注意:

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

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

【讨论】:

  • 我更新了我的帖子。请看一下映射
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多