Использование удаления сирот в 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
в спящем режиме