Использование удаления сирот в Hibernate

Я работаю в Spring-Hibernate Мой вопрос связан с orphan removal как описано ниже в коде.

@Entity
public class User {
    ...........
    @OneToMany(mappedBy = "user", orphanRemoval = true, cascade = CascadeType.ALL)
    List<UserRole> userRoles = new ArrayList<>();
    ..........
}

Принимая во внимание save/update User сценарий. Одним из способов является удаление этого дочернего объекта из списка, например user.getUserRoles().remove(userRole),
Другой способ может быть похож на очистку списка детей как user.getUserRoles().clear() а затем добавьте его в список независимо от того, какие роли пользователей поступают в запросе. В этом случае роли пользователя, не входящие в запрос, будут удалены orphan removal,

Какой из них лучше и правильнее?

2 ответа

Ну, это зависит от ситуации и типа используемой вами семантики. Для получения дополнительной информации о различных семантиках и настройке их производительности см. Производительность коллекции.

Что ж, в этом случае вы используете семантику списка для связи один ко многим, поэтому предположим, что в списке 20 элементов

Вариант 1: вы удаляете 15 элементов по одному и добавляете в него 1 элемент, после чего hibernate выдаст 15 операторов DELETE и один оператор INSERT.

Вариант 2: вы очищаете весь список и добавляете все 6 элементов вручную, таким образом, будут выданы только 6 операторов INSERT и 1DELETE.

Я перейду к варианту 2, если коллекция сильно изменена, см. Удаление одним выстрелом для получения дополнительной информации, и я перейду к варианту 1, если список сильно не изменен.
,
Ура:)

Помимо вашей коллекции и количества экземпляров на ней, я думаю, что первый способ (удаление дочернего элемента из списка) является наиболее подходящим, и это именно то, что orphanRemoval предназначен для.

Потому что с orphanRemoval все, что вам нужно сделать, это удалить дочерний элемент из таблицы отношений, и этот дочерний элемент (запись) будет автоматически удален из исходной таблицы.

Потому что, если вы посмотрите документацию по удалению сирот в отношениях, вы увидите, что:

Когда целевой объект в отношении "один-к-одному" или "один-ко-многим" удаляется из отношения, часто желательно каскадно удалить операцию для целевого объекта. Такие целевые объекты считаются "сиротами", а атрибут orphanRemoval может использоваться для указания того, что потерянные объекты должны быть удалены.

Поэтому я думаю, что лучший способ - это позволить Hibernate выполнять свою работу автоматически, а не вручную, ведь это первая цель использования orphanRemoval в спящем режиме

Другие вопросы по тегам