JPA(休眠)上的多个双向映射问题

时间:2019-07-04 14:52:24

标签: java jpa hibernate-onetomany

我在弄清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()方法时,似乎出现了错误。我不确定是由实体映射引起的,我是如何映射,获取,级联的,还是由于我在应用程序中创建它们的原因引起的。

1 个答案:

答案 0 :(得分:0)

因此,几个小时后我将其修复,显然问题是我添加它们的顺序,应该首先实例化具有OneToMany的类,并且不分配任何内容,而是直接将其保存,然后在创建ManyToOne类,然后为它们分配已保存的OneToMany类,然后将.save与存储库类一起保存,这样将为json /数据库正确分配其ID

相关问题