Как удалить дочерние объекты из отношения @ManyToMany с большим количеством детей в JPA и Hibernate

предположим, у меня есть два объекта: организация и пользователь. Каждый пользователь может быть членом многих организаций и каждая организация может иметь много пользователей.

@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);
}

но когда количество организаций составляет 10 000, это решение не имеет хорошей производительности.

Как я могу это исправить?

1 ответов


как я объяснил в в этой статье, если у вас более 50 или 100 дочерних объектов, вы не должны сопоставлять коллекцию.

таким образом, @OneToMany вводит в заблуждение, потому что, на самом деле,@OneToFew больше смысла. Таким образом, когда многие означают 1000 или 10000, сопоставление такой коллекции становится реальной проблемой производительности.

в этом случае просто сломать @ManyToMany ассоциации так что карта таблицы соединений UserOrganization.

In в этом случае вам просто нужно 2 @ManyToOne ассоциации в таблице соединения, и вы можете просто выдать запрос массового удаления, как это:

delete from UserOrganization uo
where uo.organization = :organization

вот именно!