ConstraintViolationException для ненулевого @ManyToOne, но вставка значения при удалении ограничения - PullRequest
0 голосов
/ 07 марта 2019

Я работаю с весенними данными в спящем режиме. У меня очень странное поведение при вставке новых записей в отношение @ManyToOne. Я получил ConstraintViolationException для ненулевого столбца, это нормально, потому что столбец не может быть пустым. Проблема в том, что значение на объекте не равно нулю, и, что самое странное, если я уберу ограничение из базы данных, hibernate вставит правильное значение, столбец не будет пустым! Я расскажу вам сценарий, с которым я имею дело, простую схему бронирования, где 1 резервирование может иметь несколько мест, и у каждого места есть свой выход (вот в чем проблема).

Бронирование

@Entity
public class Reservation {

    ...

    @OneToMany(mappedBy="reservation", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ReservationSeat> seats;

    ...
}

ReservationSeat

@Entity
public class ReservationSeat {

    ...

    @ManyToOne
    @JoinColumn(nullable = false, foreignKey = @ForeignKey(name = "fk_seat__exit"))
    private Stop exit;

    ...
}

Стоп

@Entity
public class Stop {

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

    ...
}

Проблема существует на ReservationSeat > exit , если я удаляю nullable = false (и удаляю ограничение для базы данных), исключение не выдается, НО КОЛОННА ПРАВИЛЬНО НАСЕЛЕНА . Если я добавлю ненулевое ограничение для базы данных и / или кода, я получу исключение ConstraintViolationException с точно таким же кодом выполнения. Вставляет ли Hibernate пустую запись и обновляет ли ее? Может ли кто-нибудь помочь мне понять, что происходит?

EDIT

Там есть упрощение потока, где я получил эту ошибку.

@Transactional
public void addReservation(){
    Stop stop1 = new Stop(1);
    Stop stop2 = new Stop(2);

    stopRespository.save(stop1);
    stopRespository.save(stop2);

    Reservation reservation1 = new Reservation();
    Reservation reservation2 = new Reservation();

    ReservationSeat reservation1Seat = new ReservationSeat();
    ReservationSeat reservation2Seat = new ReservationSeat();

    reservation1Seat.setExit(stop1);
    reservation2Seat.setExit(stop2);

    reservation1.getSeats().add(reservation1Seat);
    reservation2.getSeats().add(reservation2Seat);

    List<Reservation> reservations = new ArrayList();
    reservations.add(reservation1);
    reservations.add(reservation2);

    reservationRepository.saveAll(reservations);
}

Код работает хорошо, но я полагаю, что когда пружинные данные сбрасывают транзакцию, возникает ConstraintViolationException.

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