hibernate - 为什么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 来说很重要,我已经在两端定义了延迟获取策略。
解决方案
你需要使用:
@OneToMany(mappedBy = "{your_var}", fetch = FetchType.LAZY)
private List<B> list;
如果您使用级联,请注意:
@OneToMany(cascade = {Cascade.PERSIST}, orphanRemoval = true)
private List<B> list;
此属性充当多米诺骨牌效应,并尝试在列表不为空的情况下保留或更新列表对象,我认为在这种情况下这不是您的方法,所以不要使用它
推荐阅读
- python - 设置 Random_Seed LDA Mallet 实现(用于结果的可复制性)
- ios - Xcode 10.1:配置文件签名证书错误
- javascript - Laravel:急切加载belongsTo和HasMany关系?
- mysql - mysql DB中一个字段的动态值
- jsp - SpringSecurity 将我重定向回 login.jsp
- xmpp - 如何通知收件人有人在 ejabberd 上阻止了他们?
- ios - 如何解决应用商店中的“无效二进制”问题?
- matlab - 如何在 Matlab 中将数据值映射到颜色图/colobar
- python-3.x - 在 Python 中将 doc / docx 文件转换为 pdf
- database - 从 Azure 虚拟机上的 postgresql 断开连接