让我们说我有:
class Car {
...
@OneToMany(mappedBy = "wheel", fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
Set<Wheel> wheels;
}
class Wheel {
...
@ManyToOne(fetch = FetchType.LAZY)
Car car
}
我有这个代码(spring数据,wheelRepository扩展CrudRepository)来删除Wheel:
wheelRepository.delete(wheel);
代码不会删除滚轮,也不会抛出任何异常。 查看sql日志,没有&#34;删除&#34;言。
我终于找到了一个问题:我有一辆装有车轮的车轮。
这样做可以解决问题:
car.getWheels().remove(wheel);
wheelRepository.delete(wheel);
但是有可能避开第一行:当我删除一个轮子时,我想让车轮自动从车上移走?
另一个问题是:默认情况下是否可以抛出异常,而不是使用&#34;默默地非删除&#34;?
谢谢!
答案 0 :(得分:1)
你想要的是不可能的。当您致电wheelRepository.delete(wheel)
时,您基本上要求从数据库中移除轮子。但是,这不能从正在运行的应用程序中的所有其他位置删除实例wheel
,现在引用此实例。例如car.wheels
。所以这个例子将继续存在。因此,它无法从数据库中删除。如果您要删除wheel
,则必须首先将其从使用该cars
的所有wheel
中删除。与现实生活完全一样:)
答案 1 :(得分:0)
您可以像这样定义wheels
字段:
@OneToMany(mappedBy = "wheel", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
Set<Wheel> wheels;
这将确保当您移除Wheel
实体时,因此而成为孤儿的Car
实体也会被移除。
答案 2 :(得分:0)
您正在尝试删除包含TreeView1.Items.Add(Nil,'abc');
Wheel
但对于Car
,您尚未指定Car
。
因此,在删除CascadeType
时,它会执行Wheel
。
Car
将此添加到Car inside Wheel并尝试。