2017-10-19 136 views
4

假设我有两个实体:组织和用户。每个用户都可以成为许多组织的成员,并且每个组织都可以拥有许多用户。如何从与JPA和休眠中的许多孩子的@ManyToMany关系中删除子对象

@Entity 
public class User { 
    @ManyToMany 
    Set<Organization> organizations; 
    //... 
} 

@Entity 
public class Organization { 
    @ManyToMany(mappedBy="organizations") 
    Set<User> users; 
    //... 
} 

现在,我想删除一个组织(假设它有1000个成员)。 当用户有一些组织,这个代码是确定:

void removeOrgFromUser(Integer userId,Integer orgId){ 
    User user = session.load(User.class, userId); 
    for (Organization org : user.organizations) { 
     if(org.getId().equals(orgId)) 
      user.organizations.remove(org); 
    } 
    session.update(user); 
} 

但是当组织数为10000,这个解决方案没有很好的表现。

我该如何解决?

+0

从连接表中删除行。 – Antoniossss

+0

我想用hibernate或hql来做这件事, –

+0

@Antoniossss with sql native? –

回答

2

正如我在this article中所解释的,如果您有超过50个子实体,则不应映射集合。

因此,@OneToMany是误导性的,因为实际上,@OneToFew更有意义。所以,当许多人意味着1000时,你做错了所有事情。

在这种情况下,只需打破@ManyToMany association,让你map the join table UserOrganization

在这种情况下,你只需要2个@ManyToOne协会在连接表,并且,你可以发出一个批量删除这样的查询:

delete from UserOrganization uo 
where uo.organization = :organization 

这就是它!