试着理解CascadeType.ALL与@OnDelete的区别!

时间:2011-06-22 16:54:50

标签: java hibernate hibernate-cascade

让我直接回答我的问题,如果@OnDelete实体被删除,使用InventoryPreference会删除此实体和任何其他Inventory实体吗?我只是无法理解来自Hibernate's annotations引用的内容..所以我需要你的帮助来确认我理解正确。

public class InventoryPreference {
    ...

    @ManyToOne
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JoinColumn(name = "inventory_id", nullable = false)
    public Inventory getInventory() {
        return inventory;
    }
}

如果Inventory实体被删除,那么CascadeType.ALL实体是否还需要使用InventoryPreference来删除所有Inventory

public class Inventory {
    ...

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

如果第一个问题属实,那么我没有看到CascadeType.ALL的观点。如果不是,那么当删除InventoryPreference时,我需要指定哪些内容以及需要指定哪些注释和配置才能删除Inventory?哦,如果Inventory被删除,我不希望删除InventoryPreference。对不起,如果它太明显了。

1 个答案:

答案 0 :(得分:1)

他们做了一些不同的事情。 @OnDelete是模式生成指令。它会在为外键(或方言等价物)生成的DDL的末尾添加“on delete cascade”。如果你没有使用hibernate生成数据库,它就不会做任何事情。

cascade@OneToMany上的@ManyToOne属性是在运行时用于生成其他实际SQL语句的属性。这可能是你真正想要的,删除子项的附加删除语句,而不是删除数据库表中打开的级联?如果您想要删除库存时删除InventoryPreferences,那么您需要:

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

当然,根据您的设计添加额外的级联类型。