我在弄清JPA OneToMany / ManyToOne的映射时遇到了问题,最初被告知它与CascateType有关。所有都必须在父实体中,我确实添加了这一点,但仍然遇到了“分离”实体”错误,我更改了提取类型,现在我得到了
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing :
错误,我完全不知道该怎么办。
我有一个主要实体(储备),其中包含一个OneToOne关系和两个OneToMany关系。
OneToMany关系具有以下注释:
@OneToOne(mappedBy = "reserve", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
孩子(例如其中一个)具有两个ManyTwoOne关系,并且注释为:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idReserve", referencedColumnName = "idReserve")
以下是创建过程(实际的实体名称/属性为西班牙语,为了便于理解,我在上方进行了翻译):
Pago pago = new Pago();
pago.setTipo("Efectivo");
pago.setTotal(1500);
Alojamiento alojamiento = new Alojamiento();
alojamiento.setNombre("Hotel las Flores");
alojamiento.setNumeroDeHabitaciones(30);
alojamiento.setTipo("Hotel Turistico");
alojamiento.setValoracion(5);
alojamiento.setUbigeo(11);
alojamiento.setCodAlojamiento("ALO01");
Habitacion habitacion = new Habitacion();
habitacion.setDescripcion("Habitación Ejecutiva");
habitacion.setTipo(3);
habitacion.setNumero("5");
habitacion.setPrecio("1500 dolares");
habitacion.setCodHabitacion("HAB01");
List<Habitacion> listHab = new ArrayList<>();
listHab.add(habitacion);
alojamiento.setHabitaciones(listHab);
Usuario usuario = new Usuario();
usuario.setNombres("Jeremy");
usuario.setApellidos("Tornero");
usuario.setContrasena("1234");
usuario.setEmail("jeremy@gmail.com");
usuario.setFoto("");
usuario.setCodUsuario("USU01");
Reserva reserva = new Reserva();
reserva.setCantidadDePersonas(3);
reserva.setFechaIngreso(LocalDate.of(19,7,15));
reserva.setFechaSalida(LocalDate.of(19,10,30));
reserva.setComentarios("");
List<Habitacion> listHab2 = new ArrayList<>();
listHab2.add(habitacion);
reserva.setHabitaciones(listHab2);
reserva.setUsuario(usuario);
List<Pago> listPago = new ArrayList<>();
listPago.add(pago);
reserva.setPagos(listPago);
pago.setReserva(reserva);
habitacion.setAlojamiento(alojamiento);
habitacion.setReserva(reserva);
usuario.setReserva(reserva);
pagoRepository.save(pago);
log.info("success saving pago");
habitacionRepository.save(habitacion);
log.info("success saving habitacion");
alojamientoRepository.save(alojamiento);
log.info("success saving alojamiento");
usuarioRepository.save(usuario);
log.info("success saving usuario");
reservaRepository.save(reserva);
log.info("success saving reserva");
在调试时,应该从存储库(最后)调用save()方法时,似乎出现了错误。我不确定是由实体映射引起的,我是如何映射,获取,级联的,还是由于我在应用程序中创建它们的原因引起的。
答案 0 :(得分:0)
因此,几个小时后我将其修复,显然问题是我添加它们的顺序,应该首先实例化具有OneToMany的类,并且不分配任何内容,而是直接将其保存,然后在创建ManyToOne类,然后为它们分配已保存的OneToMany类,然后将.save与存储库类一起保存,这样将为json /数据库正确分配其ID