在OneToOne关系中删除对象ConstraintViolationException

时间:2018-06-19 06:37:12

标签: spring hibernate jpa one-to-one

我正在尝试删除作为关系所有者的实体,但我收到如下异常:

  

org.h2.jdbc.JdbcSQLException:参照完整性约束   违规行为:“FKS59BBPCYQ1GUKBWWA61TYF8YF:PUBLIC.RESERVATIONS FOREIGN   KEY(CAR_LICENSE_ID)参考PUBLIC.CARS(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);

2 个答案:

答案 0 :(得分:0)

我假设你正在扩展Spring CrudRepository<Reservation, Long>

joinColumn在预订方面,从我可以看到你想要做的是删除预订。那么为什么不从拥有一侧删除它,这看起来像预订。

将预订更改为。

@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE})

而是使用以下内容进行删除。

reservationRepository.delete(reservation);

答案 1 :(得分:0)

这是双向关系。将此添加到Car类中:

public void removeReservation() {
    if (this.reservation != null) {
        this.reservation.setCar(null);
        this.reservation = null;
    }
}

致电car.removeReservation()

然后删除汽车。