3

让我直接回答我的问题,如果实体被删除,使用@OnDelete这里将删除这个实体和任何其他实体?我只是无法从Hibernate 的注释参考中理解一件事。所以我需要你的帮助来确认我理解正确。InventoryPreferenceInventory

public class InventoryPreference {
    ...

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

如果实体被删除,我是否也Inventory需要在实体中使用CascadeType.ALLInventoryPreference删除所有 s Inventory

public class Inventory {
    ...

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

如果第一个问题是真的,那么我看不出CascadeType.ALL. 如果不是,那么这些中的每一个都做了什么以及我需要指定哪些注释和配置才能在InventoryPreference删除时Inventory删除 s?Inventory哦,如果被删除,我不希望InventoryPreference被删除。对不起,如果它太明显了。

4

1 回答 1

2

他们做的事情有些不同。 @OnDelete是模式生成指令。它将在为外键(或等效方言)生成的 DDL 的末尾添加“删除级联”。如果您不使用休眠来生成数据库,它不会做任何事情。

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

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

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

于 2011-06-22T17:07:47.317 回答