JPA entitymanager删除操作不具备性能

时间:2010-05-17 10:12:00

标签: performance hibernate jpa

当我尝试执行entityManager.remove(实例)时,基础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);

2 个答案:

答案 0 :(得分:8)

简单的答案是肯定的。 如果要删除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似乎有诀窍

答案 1 :(得分:2)

由于GroupUser也可能有级联,我认为没有办法告诉hibernate通过配置批量删除它们。

但如果您确定cascade=DELETE上没有GroupUser,请随时发出HQL / JPA-QL查询:

DELETE FROM GroupUser WHERE group=:group

如果有级联,也可以使用查询处理它们。