JPA (Hibernate) 上的多个双向映射问题
Multiple bidirectional mapping issue on JPA (Hibernate)
我在弄清楚 JPA OneToMany/ManyToOne 的映射时遇到了问题,最初我被告知它与 CascateType.ALL 需要在 parent 实体中有关,我确实添加了它,但我仍然收到 "detached entity" 错误,我更改了获取类型,现在我收到
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing :
错误,我完全不知道该怎么做。
我有一个包含一对一关系和两个一对多关系的主要实体(储备)。
OneToMany 关系将此作为注释:
@OneToOne(mappedBy = "reserve", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
children(例如其中之一)有两个 ManyTwoOne 关系,注释为:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idReserve", referencedColumnName = "idReserve")
创建过程如下(实体names/attributes是西班牙语,为了方便理解,我在上面翻译了一下):
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() 方法时遇到错误。我不完全确定它是由实体映射、我如何映射、获取、级联引起的,还是由于我在应用程序中创建它们的方式引起的。
所以,我在几个小时后修复了它,显然问题出在我添加它们的顺序上,应该首先实例化带有 OneToMany 的 classes 而不是分配任何东西,而你只是直接保存,然后在创建 ManyToOne classes 时,将已保存的 OneToMany class 分配给它们,然后使用存储库 class 进行保存,这样它将拥有它们的 ID正确分配给 json/database
我在弄清楚 JPA OneToMany/ManyToOne 的映射时遇到了问题,最初我被告知它与 CascateType.ALL 需要在 parent 实体中有关,我确实添加了它,但我仍然收到 "detached entity" 错误,我更改了获取类型,现在我收到
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing :
错误,我完全不知道该怎么做。
我有一个包含一对一关系和两个一对多关系的主要实体(储备)。
OneToMany 关系将此作为注释:
@OneToOne(mappedBy = "reserve", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
children(例如其中之一)有两个 ManyTwoOne 关系,注释为:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idReserve", referencedColumnName = "idReserve")
创建过程如下(实体names/attributes是西班牙语,为了方便理解,我在上面翻译了一下):
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() 方法时遇到错误。我不完全确定它是由实体映射、我如何映射、获取、级联引起的,还是由于我在应用程序中创建它们的方式引起的。
所以,我在几个小时后修复了它,显然问题出在我添加它们的顺序上,应该首先实例化带有 OneToMany 的 classes 而不是分配任何东西,而你只是直接保存,然后在创建 ManyToOne classes 时,将已保存的 OneToMany class 分配给它们,然后使用存储库 class 进行保存,这样它将拥有它们的 ID正确分配给 json/database