Я работаю с весенними данными в спящем режиме. У меня очень странное поведение при вставке новых записей в отношение @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.