Операция удаления объекта управления JPA не выполняется - PullRequest
7 голосов
/ 17 мая 2010

Когда я пытаюсь сделать entityManager.remove (instance), базовый поставщик JPA выполняет отдельную операцию удаления для каждого объекта GroupUser. Я считаю, что это неправильно с точки зрения производительности, поскольку, если в группе 1000 пользователей, будет сделано 1001 вызов для удаления всей группы и объекта 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);

Ответы [ 2 ]

8 голосов
/ 19 мая 2010

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

2 голосов
/ 19 мая 2010

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

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

DELETE FROM GroupUser WHERE group=:group

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...