Попытка понять разницу в CascadeType.ALL против @OnDelete!
Позвольте мне ответить на мой вопрос, используя @OnDelete
здесь удалим этот и любой другой InventoryPreference
лица, если Inventory
сущность удалена? Я просто не могу понять что-то из справочника Hibernate.. поэтому мне нужна ваша помощь, чтобы подтвердить, что я правильно понял.
public class InventoryPreference {
...
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "inventory_id", nullable = false)
public Inventory getInventory() {
return inventory;
}
}
Я тогда в Inventory
сущность нужно использовать CascadeType.ALL
слишком, чтобы получить все InventoryPreference
s удалены, если Inventory
сущность удалена?
public class Inventory {
...
@OneToMany(mappedBy = "inventory", cascade = CascadeType.ALL)
public Set<InventoryPreference> getPreferenceItems() {
return preferenceItems;
}
}
Если первый вопрос верный, то я не вижу смысла CascadeType.ALL
, Если это не так, что делают каждый из них, и какие аннотации и конфигурацию мне нужно указать, чтобы получить InventoryPreference
s удаляется, когда Inventory
удален? Ох, и я не хочу Inventory
быть удаленным, если InventoryPreference
удаляется. Извините, если это слишком очевидно.
1 ответ
Они делают несколько разные вещи. @OnDelete
является инструкцией генерации схемы Он добавит "каскад удаления" в конец DDL, сгенерированного для внешнего ключа (или эквивалента диалекта). Если вы не используете hibernate для создания базы данных, он ничего не будет делать.
cascade
собственность на @OneToMany
или же @ManyToOne
это то, что используется во время выполнения для генерации дополнительных фактических операторов SQL. Это, вероятно, то, что вы действительно хотите, дополнительные операторы удаления для удаления дочерних элементов, а не удаления каскадов, включенных в таблицу базы данных? Если вы хотите, чтобы InventoryPreferences удалялись при удалении инвентаря, то вы хотите:
@OneToMany(mappedBy = "inventory", cascade = CascadeType.REMOVE, orphanRemoval=true)
public Set<InventoryPreference> getPreferenceItems() {
return preferenceItems;
}
И, конечно, добавьте дополнительные каскадные типы в соответствии с вашим дизайном.