Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
4
respuestas

Duda con respuesta

Hola! tengo una duda respecto al codigo de la actividad

em.getTransaction().begin();
Producto producto = em.find(Producto.class, 1l);
producto.setDescripcion(“Test 1”);
em.flush();
producto.setDescripcion(“Test 2”);
em.merge(producto);
producto.setDescripcion(“Test 3”);
em.getTransaction().commit();
em.close();

Estaba entre la respuesta La entidad producto se actualizará en la base de datos con la descripción null.

y la respuesta La entidad producto se actualizará en la base de datos con la descripción Teste 3.

mas tiraba hacia la respuesta finalizada en "descripcion null." hasta que lei "se actualizaria", tampoco me convencia del todo la respuesta de "Teste 3" ya que en ningun momento PERSISTE el producto. Cuando lo pruebo en mi aplicacion salta un NullPointerException en la fila justo despues del find dejo mi codigo para que sea mas claro

public static void main(String[] args) {
        Categoria celulares = new Categoria("celulares");
        Producto samsung = new Producto("Samsung A20S", "Usado, en buen estado", new BigDecimal("200"), celulares);

        EntityManager em = JPAUtils.getEntityManager();
        CategoriaDAO categoriaDAO = new CategoriaDAO(em);

        em.getTransaction().begin();
        Producto producto = em.find(Producto.class, 1l);
        producto.setDescripcion("Test 1");
        em.flush();
        producto.setDescripcion("“Test 2”");
        em.merge(producto);
        producto.setDescripcion("“Test 3”");
        em.getTransaction().commit();
        em.close();

    }

Exception in thread "main" java.lang.NullPointerException at com.latam.alura.tiendaJPA.prueba.RegistroDeProducto.main(RegistroDeProducto.java:10)

Mis preguntas son: ¿El find permite persistir en la base de datos? ¿A que puede deberse el NullPointerException? desde ya les agradezco un monton!

4 respuestas

EDIT: despues de pensarlo un poco, si estoy buscando algo, es porque ya existe en la base de datos, mi pregunta va dirigida al estado de la entidad como tal, es decir, si yo encuentro en la base de datos lo que este buscando, traigo la entidad en el estado de Managed imagino, ¿estoy en lo correcto?

solución!

¡Hola Alexis!

Respecto a tu primera pregunta, el método find de JPA no permite persistir en la base de datos. Lo que hace es buscar una entidad en la base de datos y devolverla en forma de objeto. En tu caso, estás buscando una entidad Producto con id 1 y guardándola en la variable producto.

Respecto a tu segunda pregunta, el NullPointerException que estás recibiendo es probablemente porque no hay ningún producto con id 1 en tu base de datos. Por lo tanto, cuando intentas acceder a la propiedad descripcion del objeto producto, estás accediendo a una referencia nula y eso genera la excepción.

En cuanto a la pregunta original, la respuesta correcta es que la entidad producto se actualizará en la base de datos con la descripción "Test 3". La razón es que después de hacer em.merge(producto), la entidad producto se convierte en una entidad administrada, lo que significa que cualquier cambio que hagas en ella se reflejará en la base de datos cuando se haga la transacción. Por lo tanto, la descripción "Test 3" es la última descripción que se establece antes de hacer em.getTransaction().commit();.

Espero haber aclarado tus dudas. ¡Buenos estudios!

muchas gracias eric por tu respuesta y tu tiempo!

Clarisimo Eric!! Gracias por aclarar la duda.