Попытка понять разницу в CascadeType.ALL против @OnDelete! - PullRequest
1 голос
/ 22 июня 2011

Позвольте мне ответить на мой вопрос, используя здесь @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 Ответ

1 голос
/ 22 июня 2011

Они делают несколько разные вещи. @OnDelete - инструкция генерации схемы. Он добавит «каскад удаления» в конец DDL, сгенерированного для внешнего ключа (или эквивалента диалекта). Если вы не используете hibernate для генерации базы данных, он ничего не сделает.

Свойство cascade в @OneToMany или @ManyToOne - это то, что используется во время выполнения для генерации дополнительных фактических операторов SQL. Это, вероятно, то, что вы на самом деле хотите, дополнительные операторы удаления для удаления дочерних элементов, а не удаления каскадов, включенных в таблицу базы данных? Если вы хотите, чтобы InventoryPreferences удалялись при удалении инвентаря, то вы хотите:

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

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

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