Когда я запускаю метод GET Http localhost:8080/api/empl/drivers/id=1, я получаю json:
{
"pesel": "240028313144621540785598931",
"firstName": "Janusz",
"lastName": "Nosacz",
"login": "user2",
"email": "[email protected]",
"isActive": null,
"userRole": "DRIVER",
"active": null,
"id": 1
}
Все в порядке, но когда я хочу удалить идентификатор с помощью метода DELETE Http: localhost:8080/api/empl/drivers/id=1, я получаю сообщение об ошибке: "could not execute statement; SQL [n/a]; constraint [\"FKDPOR9OHOV2F3OPTWE7TWE49TT: DBO.VEHICLE FOREIGN KEY(DRIVER_ID) REFERENCES DBO.DRIVER(ID) (1)\"; SQL statement:\ndelete from driver where id=? [23503-197]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
То же самое происходит, когда я бегу:
Driver employee0 = new Driver("94112757255", "Janusz", "Nosacz");
employee0.setUser(user2);
driverRepo.save(employee0);
driverRepo.deleteById(1L);
Я думаю, это из-за Vehicle, который связан с драйвером id = 1. Связь косвенная. (Водитель не связан с автомобилем).
@Entity
public class Vehicle {
// ...
@OneToOne(cascade=CascadeType.REFRESH)
private Driver driver;
// ...
}
// ...
Vehicle vehicle0 = new Vehicle("1FTEF27L2VND02190");
vehicle0.setDriver(employee0);
vehicleRepo.save(vehicle0);
И вот как я делаю удаление в драйвере:
@Service
public class DriverServiceImpl implements DriverService {
private final DriverRepo driverRepo;
// ...
@Override
public void deleteDriver(Long id) {
driverRepo.deleteById(id);
}
}
В связи с аналогичными проблемами, обнаруженными на stackoverflow.com, я попытался использовать cascade.ALL и orphonalremoval = true, но это не помогло.
Есть идеи, как это решить? Думаю, мне нужно удалить ссылки на водителя с id = 1 для транспортного средства, но это проблематично ...
Вот полный код приложения: https://github.com/woblak/deliverp
Таблицы создаются с помощью спящего режима, а не моего sql, поэтому это не так просто ... Не знаю, как добавить его с помощью jpa, я должен искать ...
Как выглядит отображение драйвера?
Вот Driver: github.com/woblak/deliverp/blob/master/deliverp-core/src/mai n /…, который расширяет Employee: github.com/woblak/deliverp/blob/master/deliverp-core/src/mai n /…, а вот Vehicle: github.com/woblak/deliverp/blob/master/deliverp-core/src/mai n /….




Это решение:
class Driver {
@Id
Long id;
@OneToOne(mappedBy = "driver")
Vehicle vehicle;
@PreRemove
public void preRemove() {
vehicle.setDriver(null);
}
// getters and setters...
}
class Vehicle{
@Id
Long id;
@OneToOne
Driver driver;
// getters and setters
}
Ключ состоял в том, чтобы сделать ассоциацию двунаправленной и добавить метод с аннотацией @PreRemove, которая запускается до удаления объекта.
Пожалуйста, переформатируйте код и добавьте описание.
Можете ли вы добавить
on delete cascadeилиon delete set nullв таблицу схемы базы данных транспортных средств?