Когда я пытаюсь сделать 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);
Простой ответ - да.
Если вы хотите удалить 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
делает трюк
Поскольку GroupUser
также может иметь каскады, я не думаю, что есть способ указать спящему режиму пакетное удаление их через конфигурацию.
Но если вы уверены, что нет cascade = DELETE
на GroupUser
, не стесняйтесь отправлять запрос HQL / JPA-QL:
DELETE FROM GroupUser WHERE group=:group
Если есть каскады, обработайте их тоже с запросом.