让我直接回答我的问题,如果删除了@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;
}
当然,还可以根据您的设计添加其他层叠类型。