gpt4 book ai didi

performance - JPA entitymanager 删除操作性能不佳

转载 作者:行者123 更新时间:2023-12-03 14:56:17 24 4
gpt4 key购买 nike

当我尝试执行 entityManager.remove(instance) 时,底层 JPA 提供程序对每个 GroupUser 实体发出单独的删除操作。我觉得从性能的角度来看这是不对的,因为如果一个组有 1000 个用户,将发出 1001 个调用来删除整个组和 itr groupuser 实体。

编写一个命名查询来删除 groupuser 表中的所有条目是否更有意义(例如,从 group_user 中删除 group_id=?),所以我只需要进行 2 次调用即可删除该组。

@Entity
@Table(name = "tbl_group")

public class Group {

@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Cascade(value = DELETE_ORPHAN)
private Set<GroupUser> groupUsers = new HashSet<GroupUser>(0);

最佳答案

简单的答案是肯定的。
如果要删除 Group您知道 GroupUser 中有大量记录表,那么最好创建一个删除查询,该查询将在一批中完成所有操作,而不是一个又一个。

如果您在底层数据库上没有级联,(或者即使您有)按正确顺序执行它的好习惯。

所以删除GroupUser第一的。
假设您有一个要删除的 Group 对象。

int numberDeleted = entityManager.createQuery("DELETE FROM GroupUser gu WHERE gu.group.id=:id").setParameter("id",group.getId()).executeUpdate();

返回的 int 显示删除了多少记录。

现在终于可以删除 Group
entityManager.remove(group);
entityManager.flush();

更新

好像 @OnDelete@OneToMany有诀窍

关于performance - JPA entitymanager 删除操作性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2848164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com