删除不在Hibernate / Spring Data中工作

时间:2018-05-17 06:50:40

标签: java hibernate spring-boot spring-data

让我们说我有:

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;?

谢谢!

3 个答案:

答案 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并尝试。