Estas son las secuencias que conducen a la pregunta:JPA: ¿Cuál es el comportamiento de la fusión con la colección inicializada perezosa?
- tengo un récord del equipo, y 3 registros en la base de datos del jugador. entidad equipo tiene una lista que está utilizando FetchType.LAZY, CascadeType.ALL
- El botón de búsqueda en la webui se hace clic en
- consulta en el lado del servidor mediante la consulta de la APP se invoca, la búsqueda de todos los registros del equipo, en este caso, solo 1 registro de la entidad del equipo devuelta desde la consulta (que tiene un proxy de la lista de entidades de jugadores)
- Asigna este equipo a una DTO y devuelve este DTO al webui, omitiendo el mapeo de la lista de entidades de jugadores
- Webui representa el DTO en un formulario html, listo para recibir modificaciones del usuario
- El usuario modifica las propiedades del equipo, como la fecha de f undada
- se hace clic en el botón Guardar de la webui
- La conversión de la DTO a la entidad de equipo, que se utilizará para actualizar el registro del equipo ya existente
- Pero en este caso, si yo fuera a utilizar el em.merge (teamEntity), el registro del equipo se actualizará, pero ¿qué pasará con la lista de jugadores? Porque al convertir de DTO a la entidad del equipo, teamEntity tiene una lista vacía de entidades de jugadores. Y después de fusionarme, noté que la teamEntity tiene 0 tamaño de detalles. Pero después de refrescar esa entidad, em.refresh (teamEntity), devolverá 3 del tamaño de detalle.
Im confundido en:
- ¿Por qué es el tamaño es 0 después se fusionó? Es como no representar más el registro
- Antes de hacer la prueba, estaba pensando que los detalles se eliminarán ya que estoy fusionando una teamEntity con un detalle vacío.
favor ilumíneme :)
Gracias!
axtavt: ¡Gracias por la explicación! Acabo de probar todas las posibilidades que mencionó, y ahora está empezando a comprender la situación.Acerca de su extracto: "Si llama a flush() antes de llamar a refresh(), y Team es el propietario, la lista estará vacía, ya que la destrucción de relaciones se propagó a la base de datos durante flush()", será así si orphanRemoval true se usa. De lo contrario, los niños sobreviven y la actualización los restaurará en la lista de jugadores de la entidad. Gracias de nuevo ! – bertie
¿Qué proveedor de JPA usas? Estoy familiarizado con Hibernate, sin JPA, que también tiene una operación de combinación y colecciones diferidas, y cuando intento leer una colección no inicializada desde una instancia separada, obtengo una excepción, no una colección vacía. Creo que es un error del proveedor. Como solución, inicialice esa colección antes de que TeamPlayer se separe. – Oliv