Despues de un UPDATE , ejecuto un select pero los datos no se actualizan

publicado por: Anonymous

estoy trabajando JPA , ejecuto el siguiente update:

  public int EditarUsuario(UserSys us) {

    EntityManager em = getEntityManager();
    em.getTransaction().begin();
    try {
        Query q = em.createNativeQuery("UPDATE `user_sys` "
                + "SET "
                + "`USER_NOM` = ?, "
                + "`USER_ESTADO` = ?, "
                + "`USER_ROL` = ? "
                + "WHERE `USER_ID` = ?; ");
        q.setParameter(1, us.getUserNom());
        q.setParameter(2, us.getUserEstado());
        q.setParameter(3, us.getUserRol());
        q.setParameter(4, us.getUserId());
        int v = q.executeUpdate();
        em.getTransaction().commit();
        return v;
    } catch (javax.persistence.NoResultException ex) {
        return 0;
    } finally {
        em.close();
    }
}

Funciona perfecto , ya que al ejecutar la consulta sobre mysql directamente veo la actualización , sin embargo al hacer el select * from de esa tabla no veo en los cambios en jpa:

 public List<UserSys> Buscartodos() {
   EntityManager em = getEntityManager();
   em.clear();

    try {
        Query q = em.createNativeQuery("SELECT * FROM user_sys ;", UserSys.class);
       List<UserSys> lista=q.getResultList();

        return lista;

    } catch (javax.persistence.NoResultException ex) {
        return null;
    } finally {
        em.close();
    }

}

He hecho inserts y funcionan y actualizan los datos , en este caso que puede estar pasando?

solución

Luego de cerrar la transacción y cerrar el EntityManager, las operaciones son correctamente perpetuadas en tu base de datos y futuras consultas, por ser nuevas transacciones, podrán leer los cambios realizados por transacciones anteriores.

El tuyo es un caso muy peculiar, puesto que explicas que a pesar de cerrar la transacción y el EntityManager, es como si no se hubiesen reflejado los cambios hechos en la base de datos, asumiendo que estas operaciones las ejecutas de manera secuencial y que se han cerrado todas las sesiones antes de ejecutar tu sentencia SELECT.

En todo caso, puedes acudir a los métodos EntityManager#flush y EntityManager#clear, en ese orden, para que todas las operaciones se ejecuten y que puedas ver los cambios reflejados. El código de tu consulta quedaría como sigue:

public List<UserSys> Buscartodos() {
    EntityManager em = getEntityManager();
    em.flush();
    em.clear();
    try {
    /*
        resto de tu código
        incluye cerrar este bloque try y aplicar finally
        para cerrar los recursos
    */
}
Respondido por: user227

Leave a Reply

Your email address will not be published. Required fields are marked *