2017-10-19 149 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 

這就是它!