Попытка понять разницу в 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 слишком, чтобы получить все InventoryPreferences удалены, если Inventory сущность удалена?

public class Inventory {
    ...

    @OneToMany(mappedBy = "inventory", cascade = CascadeType.ALL)
    public Set<InventoryPreference> getPreferenceItems() {
        return preferenceItems;
    }
}

Если первый вопрос верный, то я не вижу смысла CascadeType.ALL, Если это не так, что делают каждый из них, и какие аннотации и конфигурацию мне нужно указать, чтобы получить InventoryPreferences удаляется, когда 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;
}

И, конечно, добавьте дополнительные каскадные типы в соответствии с вашим дизайном.

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