簡體   English   中英

JPA(休眠)上的多個雙向映射問題

[英]Multiple bidirectional mapping issue on JPA (Hibernate)

我在弄清JPA OneToMany / ManyToOne的映射時遇到了問題,最初被告知它與CascateType.ALL有關,所有都必須在父實體中,我確實添加了這一點,但仍然出現“分離實體”錯誤,我更改了提取類型,現在我得到了

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()方法時出現錯誤(最后)。 我不完全確定這是由實體映射引起的,還是由我如何映射,獲取,級聯引起的,還是由在應用程序中創建它們的原因引起的。

因此,幾個小時后我將其修復,顯然問題是我添加它們的順序,應該首先實例化具有OneToMany的類,並且不分配任何內容,而是直接將其保存,然后在ManyToOne類被保存時創建后,為他們分配已經保存的OneToMany類,然后將.save與存儲庫類一起分配,這樣它將為json / database正確分配其ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM