Простая ошибка отношения ManyToOne на внешнем ключе не обнуляется - PullRequest
0 голосов
/ 18 октября 2019

Используя весеннюю загрузку и спящие аннотации, я хочу, чтобы Depot содержал несколько BusVehicle в отношениях «многие к одному». BusVehicules также нельзя назначить для депо, помечая их внешний ключ как ноль. Из того, что я прочитал, по умолчанию это должно быть nullable, но я получаю следующую ошибку при попытке вставить мой элемент:

There was an unexpected error (type=Internal Server Error, status=500).
could not execute statement; SQL [n/a]; constraint ["FK9ORG94PEJ62WYIS4QS1F2WCP7: PUBLIC.BUSVEHICULE FOREIGN KEY(ID) REFERENCES PUBLIC.DEPOT(ID) (1)"; SQL statement: insert into busvehicule (id, busvehicule_color, fk_depot_id, busvehicule_passengercapacity, busvehicule_platenumber, busvehicule_type) values (null, ?, ?, ?, ?, ?) [23506-199]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

Я попытался добавить аннотации, такие как nullable = true или необязательный = true, но ничего не изменилось. Я использую базу данных H2.

BusVehicle:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(optional=true)
@JoinColumn(name ="FK_depotId", nullable = true)
private Depot depotParkedIn;

Склад:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "DEPOT_BUSVEHICULESPARKED")
@OneToMany(mappedBy="id", cascade = CascadeType.DETACH, fetch=FetchType.EAGER)
private Set<BusVehicle> busVehiclesParked = new HashSet<BusVehicle>();

h2 управление:

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:test

Код, сохраняющийобъект:

@Autowired
BusVehicleRepository busVehiculeRepository;

@PostMapping("/createbusvehicle")
public String checkAndCreateBusVehicle (BusVehicle newBusVehicle, Model model) {
    if (!BusVehiculeWrapper.ValidateBusVehicle(newBusVehicle)) {
        return "createBusVehicle";
    }
    busVehiculeRepository.save(newBusVehicle);
    return "mainpage";
}

busVehiculeRepository:

@Repository
public interface BusVehicleRepository extends JpaRepository<BusVehicle, Long> {
     public List<BusVehicle> findByDepotParkedInNull();
}

Сбой при сохранении метода из хранилища после прохождения моей пользовательской проверки (которая не проверяет, что хранилище не является нулевым, так как этоожидается.)

1 Ответ

1 голос
/ 18 октября 2019

Ваша проблема здесь:

@OneToMany(mappedBy="id", cascade = CascadeType.DETACH, fetch=FetchType.EAGER)
private Set<BusVehicle> busVehiclesParked = new HashSet<BusVehicle>();

Это поле "mappedBy" означает:

В классе BusVehicle, какое поле ссылается на мой класс?

Если мы посмотрим на ваш класс "BusVehicle", поле ссылки будет (depotParkedIn):

@ManyToOne
@JoinColumn(name ="FK_depotId")
private Depot depotParkedIn;

Итак, попробуйте изменить на:

@OneToMany(mappedBy="depotParkedIn", cascade = CascadeType.DETACH, fetch=FetchType.EAGER)
private Set<BusVehicle> busVehiclesParked = new HashSet<BusVehicle>();

FYI:Только что протестировано локально с обеими реализациями, и с изменением здесь все заработало.

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