让我直接回答我的问题,如果@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
。对不起,如果它太明显了。
答案 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;
}
当然,根据您的设计添加额外的级联类型。