我正在通过休眠处理spring数据。我在@ManyToOne关系中插入新记录有一个非常奇怪的行为。我为非null列获取了ConstraintViolationException,这是可以的,因为该列不能为null。问题在于,实体上的值不为null,并且发生了一些奇怪的事情,如果我从数据库中删除了约束,hibernate将插入正确的值,而不会插入null列! 我将向您介绍我正在处理的方案,即简单的保留架构,其中1个保留可以有多个席位,而每个席位都有自己的出口(这就是问题所在)。
预订
@Entity
public class Reservation {
...
@OneToMany(mappedBy="reservation", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ReservationSeat> seats;
...
}
预订座位
@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;
...
}
预订座位> 退出上存在问题,如果我删除了 nullable = false (并删除了数据库约束),则没有例外正确插入列。如果在数据库和/或代码上添加非null约束,则会得到具有完全相同的执行代码的ConstraintViolationException。 Hibernate会插入一个空的记录蚂蚁然后更新它吗?有人可以帮助我了解发生了什么事吗?
编辑
我得到此错误的流程很简单。
@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);
}
代码运行良好,但是我想是当spring数据刷新事务时,ConstraintViolationException发生了。