Search code examples
hibernateejb

org.hibernate.transactionexception nested transactions not supported What am I doing wrong?


I dont know why am I getting this error:

javax.faces.FacesException: #{loginBean.login}: org.hibernate.TransactionException: nested transactions not supported

public class UsuarioDaoImpl implements UsuarioDao {

@Override
public FwUsuarios findByUsuario(FwUsuarios usuario) {
  FwUsuarios model = null;

 System.out.println("El usuario es : "+usuario.getClaveUsuario());
 String sql = "FROM FwUsuarios WHERE claveUsuario='"+usuario.getClaveUsuario()+"'";
 Session sesion = HibernateUtil.getSessionFactory().getCurrentSession();
  try{

      sesion.beginTransaction();
      model=(FwUsuarios) sesion.createQuery(sql).uniqueResult();
      sesion.beginTransaction().commit();
  }
  catch(Exception e){
  sesion.beginTransaction().rollback();
  }

  return model;
}

@Override
public FwUsuarios login(FwUsuarios usuario) {
    FwUsuarios model = this.findByUsuario(usuario);
    if(model!= null){
    if(usuario.getPasswordUsuario().equals(model.getPasswordUsuario()))
        model = null;
    }
    return model;
}

}



public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
    try {
        // Create the SessionFactory from standard (hibernate.cfg.xml) 
        // config file.
        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    } catch (HibernateException ex) {
        // Log the exception. 
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

Solution

  • Calling beginTransaction unnecessarily several time is the problem. Instead one should call it once, and use stored reference later on:

    org.hibernate.Transaction tx;
    //...
    tx = session.beginTransaction();
    //.. some database work here
    tx.commit();
    //when something went wrong
    tx.rollback();