我正在尝试删除作为关系所有者的实体,但我收到异常如下:
org.h2.jdbc.JdbcSQLException: Referential integrity constraint 违规:"FKS59BBPCYQ1GUKBWWA61TYF8YF:公开。国外预订 密钥 (CAR_LICENSE_ID( 引用公共。汽车(LICENSE_ID(("EPA13S"("; SQL语句:
我知道这是因为试图删除另一个对象与fk_key有引用的对象。这是我的模型:
public class Reservation
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
@Enumerated(EnumType.STRING)
private DriverType driverType;
private LocalDateTime startTime;
private LocalDateTime stopTime;
@OneToOne(cascade = CascadeType.PERSIST)
private Car car;
private BigDecimal cost;
}
public class Car
{
@Id
@NonNull
@Size(min = 6, max = 6)
String licenseId;
@OneToOne(mappedBy = "car", cascade = CascadeType.REMOVE)
Reservation reservation;
}
我怎么可能处理这种情况?我想在预订结束时从停车场中删除汽车,因为我不需要它,并且拥有许可证 ID pk_key使其容易受到尝试插入新车和即将到来的预订,即使前一个已经结束。
删除汽车:
carRepository.deleteByLicenseId(reservation.getCarLicenseId());
@Query("DELETE FROM Car c where c.licenseId = :licenseId")
void deleteByLicenseId(@Param("licenseId") String licenseId);
我假设你正在扩展春季CrudRepository<Reservation, Long>
joinColumn 位于预留端,从我可以看到您要做的是删除预留。那么为什么不从拥有方删除它,这看起来像是保留。
将"预留"更改为。
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
而是使用以下内容进行删除。
reservationRepository.delete(reservation);
这是一种双向关系。将此添加到类Car
:
public void removeReservation() {
if (this.reservation != null) {
this.reservation.setCar(null);
this.reservation = null;
}
}
呼叫car.removeReservation()
。
然后删除汽车。