ConstraintViolationException при удалении - PullRequest
0 голосов
/ 21 декабря 2018

Когда я запускаю метод GET Http localhost:8080/api/empl/drivers/id=1, тогда я получаю json:

{
    "pesel": "240028313144621540785598931",
    "firstName": "Janusz",
    "lastName": "Nosacz",
    "login": "user2",
    "email": "driver@example.com",
    "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);

Я думаю, это из-за транспортного средства, которое связано с водителем с 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

1 Ответ

0 голосов
/ 25 декабря 2018

Это решение:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...