当我尝试执行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);
答案 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
如果有级联,也可以使用查询处理它们。