ConstraintViolationException при удалении

Когда я запускаю метод 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

Можете ли вы добавить on delete cascade или on delete set null в таблицу схемы базы данных транспортных средств?

Selaron 21.12.2018 12:52

Таблицы создаются с помощью спящего режима, а не моего sql, поэтому это не так просто ... Не знаю, как добавить его с помощью jpa, я должен искать ...

stakowerflol 21.12.2018 12:56

Как выглядит отображение драйвера?

Simon Martinelli 21.12.2018 13:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
391
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это решение:

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, которая запускается до удаления объекта.

Пожалуйста, переформатируйте код и добавьте описание.

Nikolas Charalambidis 25.12.2018 21:38

Другие вопросы по теме