Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Duda con la respuesta

Hola, tengo una duda, y es que en el vídeo explican que al momento de utilizar el código em.merge(Producto); se esta haciendo un select, pero si ese valor no lo damos al objeto producto, este no actualizará, pero veo que en este código no aplica y se actualiza hasta el Teste 3, porque?

2 respuestas

Ya vi que es proque no ejecutan el clear() o close()

Hola Jerónimo,

Sí, cuando llamas a em.find(Producto.class, 1l), JPA realiza una consulta a la base de datos y recupera el producto con el id 1. Este producto se convierte en un objeto gestionado por el contexto de persistencia, lo que significa que cualquier cambio que hagas en el objeto será rastreado por JPA.

Cuando cambias la descripción a "Test 1" y luego llamas a em.flush(), JPA sincroniza el estado del objeto con la base de datos, pero el objeto sigue siendo gestionado, es decir, cualquier cambio posterior seguirá siendo rastreado.

Luego, cambias la descripción a "Test 2" y llamas a em.merge(producto). En este punto, JPA verifica si hay alguna diferencia entre el estado actual del objeto y el estado de la base de datos. Como has llamado a flush() después de cambiar la descripción a "Test 1", no hay ninguna diferencia y por lo tanto, no se realiza ninguna operación.

Finalmente, cambias la descripción a "Test 3" y llamas a em.getTransaction().commit(). Como el objeto sigue siendo gestionado, JPA detecta que la descripción ha cambiado desde el último flush() y actualiza la base de datos con el nuevo valor.

Por lo tanto, la descripción final en la base de datos será "Test 3", que es la opción B.

Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios