让我直接回答我的问题,如果删除了@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。对不起,如果太明显。

最佳答案

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

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

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


当然,还可以根据您的设计添加其他层叠类型。

10-08 19:21