JPA entitymanager удаляют операцию, не производительно

Когда я пытаюсь сделать entityManager.remove (экземпляр), базовые отдельные проблемы a поставщика JPA удаляют операцию на каждом объекте GroupUser. Я чувствую, что это не правильно с точки зрения производительности, с тех пор если у Группы будет 1 000 пользователей то будет 1 001 приказ, изданный для удаления всей группы и 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);
7
задан Sam 18 May 2010 в 05:04
поделиться

2 ответа

Простой ответ - да. Если вы хотите удалить 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();

UPDATE

Похоже, что @OnDelete на @OneToMany делает трюк

8
ответ дан 7 December 2019 в 01:17
поделиться

Поскольку GroupUser также может иметь каскады, я не думаю, что есть способ указать спящему режиму пакетное удаление их через конфигурацию.

Но если вы уверены, что нет cascade = DELETE на GroupUser , не стесняйтесь отправлять запрос HQL / JPA-QL:

DELETE FROM GroupUser WHERE group=:group

Если есть каскады, обработайте их тоже с запросом.

2
ответ дан 7 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: