JPA entitymanager删除操作不具备性能

Sam*_*Sam 7 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);
Run Code Online (Sandbox Code Playgroud)

She*_*ari 8

简单的答案是肯定的.如果你想删除a Group并且你知道GroupUser表中有大量的记录,那么创建一个删除查询会更好,这个查询将在一个批处理而不是一个批处理中执行.

如果你没有底层数据库的级联,(或者即使你这样做),它的良好做法是按正确的顺序执行.

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

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

返回的int显示删除的记录数.

现在你终于可以删除了 Group

entityManager.remove(group);
entityManager.flush();
Run Code Online (Sandbox Code Playgroud)

UPDATE

好像@OnDelete@OneToMany做的伎俩

  • @Samuel.前几天我确实问过一个非常相似的问题.你可以在这里找到它:http://stackoverflow.com/questions/2856460/hibernate-doesnt-generate-cascade使用@OnDelete代替级联的提示可能意味着它不会将实例1删除1.可以尝试一下.我还没有尝试过. (2认同)