非空@ManyToOne上的ConstraintViolationException,但在删除约束时插入值

时间:2019-03-07 17:14:32

标签: hibernate jpa spring-data-jpa many-to-one

我正在通过休眠处理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发生了。

0 个答案:

没有答案