gpt4 book ai didi

java - Hibernate/Spring Data 上的级联删除

转载 作者:行者123 更新时间:2023-12-01 09:34:34 28 4
gpt4 key购买 nike

我有以下实体:

@Entity
public class Car { ... }

@Entity
public class Driver {
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "CAR_ID")
private Car car;

...
}

@Entity
public class Penalty {
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="D_ID")
private Driver driver;

...
}

我希望在将 Car 删除为 carRepository.delete(car_id)< 时删除来自 DriverPenalty 的所有信息.

WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1451, SQLState: 23000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`car_drivers`, CONSTRAINT `FK9ux9oqx6yr66cva4ro6l8m63r` FOREIGN KEY (`CAR_ID`) REFERENCES `cars` (`CAR_ID`))
ERROR: org.hibernate.internal.ExceptionMapperStandardImpl - HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
ERROR: com.app.cars.controller.AdminController - Exception during deleting car due to could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

无法更改表属性和设计。因此,需要通过修复实体模型来消除此错误。

最佳答案

您的实体模型不会将删除级联到Driver,然后级联到Penalty,因此数据库会引发约束违规错误。模型应如下所示:

@Entity
class Car {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "car", orphanRemoval = true)
private Set<Driver> drivers;

...
}

@Entity
class Driver {
@ManyToOne
private Car car;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "driver", orphanRemoval = true)
private Set<Penalty> penalties;

...
}

@Entity
class Penalty {
@ManyToOne
private Driver driver;

...
}

关于java - Hibernate/Spring Data 上的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111355/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com