【问题标题】:Delete not working in Hibernate / Spring Data删除在 Hibernate / Spring Data 中不起作用
【发布时间】:2018-10-27 08:18:21
【问题描述】:

假设我有:

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

}

我有这段代码(弹簧数据,wheelRepository 扩展 CrudRepository)来删除一个 Wheel:

wheelRepository.delete(wheel);

代码没有删除轮子,也没有抛出任何异常。 查看sql日志,没有“delete”语句。

我终于找到了一个问题:我有一辆带有轮组的汽车。

这样做可以解决问题:

car.getWheels().remove(wheel);
wheelRepository.delete(wheel);

但是是否可以避免第一行:当我删除一个轮子时,我希望轮子自动从它的车上移除?

另一个问题:是否可以默认抛出异常而不是“静默不删除”?

谢谢!

【问题讨论】:

    标签: java hibernate spring-boot spring-data


    【解决方案1】:

    你想要的不太可能。当您致电wheelRepository.delete(wheel) 时,您实际上是要求从数据库中删除轮子。但这不能从您正在运行的应用程序中现在引用此实例的所有其他位置删除实例wheel。如car.wheels。所以这个实例将继续存在。因此,它不能从数据库中删除。如果您想删除wheel,您必须首先从所有使用该wheelcars 中删除它。和现实生活中的一模一样:)

    【讨论】:

      【解决方案2】:

      您可以像这样定义wheels 字段:

      @OneToMany(mappedBy = "wheel", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
      Set<Wheel> wheels;
      

      这将确保当您删除 Wheel 实体时,因为它而成为孤儿的 Car 实体也将被删除。

      【讨论】:

      • 但是我不想拆车,只想拆一个轮子:-)
      【解决方案3】:

      您正在尝试删除包含CarWheel

      但是对于Car,你没有指定CascadeType

      因此,在删除 Wheel 时,它确实 ntg 到 Car

      @ManyToOne(cascade = CascadeType.ALL) 
      

      将此添加到车轮内的汽车并尝试。

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 1970-01-01
        • 2013-09-23
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2021-12-19
        相关资源
        最近更新 更多