Java tutorial
/* ------------------------------------------------------------------- * OperacionesDAO.java * versin 1.0 * Copyright (C) 2016 Kan-Balam. * Facultad de Ciencias, * Universidad Nacional Autnoma de Mxico, Mexico. * * Este programa es software libre; se puede redistribuir * y/o modificar en los trminos establecidos por la * Licencia Pblica General de GNU tal como fue publicada * por la Free Software Foundation en la versin 2 o * superior. * * Este programa es distribuido con la esperanza de que * resulte de utilidad, pero SIN GARANT?A ALGUNA; de hecho * sin la garanta implcita de COMERCIALIZACIN o * ADECUACIN PARA PROPSITOS PARTICULARES. Vase la * Licencia Pblica General de GNU para mayores detalles. * * Con este programa se debe haber recibido una copia de la * Licencia Pblica General de GNU, de no ser as, visite el * siguiente URL: * http://www.gnu.org/licenses/gpl.html * o escriba a la Free Software Foundation Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ------------------------------------------------------------------- */ package dao; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.Transaction; import modelo.Agente; import modelo.Mensaje; import modelo.Programador; import modelo.Registro; import modelo.Servicio; import modelo.TipoUsuario; import modelo.Usuario; import org.hibernate.TransactionException; import org.hibernate.type.StandardBasicTypes; import util.HibernateUtil; /** * @author Kan-Balam * @version 1.0 * @since Mar 09 2016. * <p> * Clase para poder manejar el acceso a la base de datos.</p> * * <p> * Clase controladora en particular de la base de datos.</p> */ public class OperacionesDAO { /** Es la sesin que accede a la base. */ private Session session; /** * Metodo que nos regresa una session. * @return Una nueva session o una que estemos usando. */ private synchronized Session session() { if (HibernateUtil.getSessionFactory().isClosed()) { session = HibernateUtil.getSessionFactory().openSession(); } else { session = HibernateUtil.getSessionFactory().getCurrentSession(); } return session; } /** * Metodo que cierra una sessin. */ private synchronized void closeSession() { if (session != null && session.isOpen()) { session.close(); } } /** * Metodo para buscar un usuario. * @param id - Es el id del usuario. * @return Un usuario de la base de datos o null si no existe. */ public Usuario buscaUsuario(int id) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from usuario where id_Usuario = :id") .addEntity(Usuario.class).setInteger("id", id); return (Usuario) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Nos da un usuario dado un telefono. * @param telefono - Es el telefono del usuario. * @return Un usuario que coincida con ese telfono o null si no existe. */ public Usuario buscaUsuarioPorTelefono(Long telefono) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from usuario where telefono = :telefono") .addEntity(Usuario.class).setLong("telefono", telefono); return (Usuario) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Nos da un usuario dado un correo. * @param correo - Es el correo del usuario. * @return Un usuario que coincida con el correo o null. */ public Usuario buscaUsuarioPorCorreo(String correo) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from usuario where correo = :correo") .addEntity(Usuario.class).setString("correo", correo); return (Usuario) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Regresa la lista de bloqueados de un Usuario. An no s para qu, pero * seguro resultar til * @param u - Es el usuario que desea obtener la lista de bloqueados. * @return Una lista con los id de los bloqueados. */ public List<Integer> obtenListaDeBloqueados(Usuario u) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select id_bloqueado from bloqueados where " + "id_bloqueador = :id") .addScalar("id_bloqueado", StandardBasicTypes.INTEGER); q.setInteger("id", u.getIdUsuario()); /* La lista de usuarios bloqueados */ List<Integer> lista = q.list(); return lista; } catch (Exception e) { e.printStackTrace(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } // Metodo privado que guarda a un programador. private void guardaProgramador(Usuario u) { Transaction tx = session().beginTransaction(); try { Programador p = new Programador(u); session().save(u); session().save(p); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } // Metodo privado que guarda a un agente. private void guardaAgente(Usuario u) { Transaction tx = session().beginTransaction(); try { Agente a = new Agente(u); session().save(u); session().save(a); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Metodo para guardar a un usuario en la base. * @param u - El usuario a guardar. * @param tipo - El tipo de usuario. */ public void guarda(Usuario u, TipoUsuario tipo) { if (tipo == TipoUsuario.AGENTE) { guardaAgente(u); } else if (tipo == TipoUsuario.PROGRAMADOR) { guardaProgramador(u); } } /** * Guarda el mensaje en la base de datos. * @param m - Es el mensaje a guardar. */ public void guardaMensaje(Mensaje m) { Transaction tx = session().beginTransaction(); try { session().save(m); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Guarda a un usuario en la base de datos. * @param u - El usuario a guardar. */ public void guardaUsuario(Usuario u) { Transaction tx = session().beginTransaction(); try { session().save(u); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Metodo para actualizar a un usuario. * @param u - El usuario que se desea actualizar. * @return true si se pudo actualizar. */ public boolean actualizaUsuario(Usuario u) { Transaction tx = session().beginTransaction(); try { session().update(u); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); return false; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return true; } /** * Actualiza al agente. * @param a - Es el agente a actualizar. * @return true si se pudo actualizar al objeto. */ public boolean actualizaAgente(Agente a) { Transaction tx = session().beginTransaction(); try { session().update(a); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); return false; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return true; } /** * Actualiza a un programador. * @param p - Es el programador a actualizar. * @return true si se pudo actualizar al objeto. */ public boolean actualizaProgramador(Programador p) { Transaction tx = session().beginTransaction(); try { session().update(p); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); return false; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return true; } /** * Metodo para verificar los datos de un usuario. * @param usuario - Es el usuario a verificar. * @return El usuario que se desea encontrar o null si no existe. */ public Usuario verificarDatos(Usuario usuario) { Transaction tx = session().beginTransaction(); try { Query q = session() .createSQLQuery("select * from usuario where correo = :correo and contrasenia = :contrasea") .addEntity(Usuario.class).setString("correo", usuario.getCorreo()) .setString("contrasea", usuario.getContrasenia()); Usuario u = (Usuario) q.uniqueResult(); if (!tx.wasCommitted()) { tx.commit(); } return u; } catch (Exception e) { e.printStackTrace(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Metodo para eliminar un usuario de la base de datos. * @param u - Es el usuario a eliminar. * @return true si se pudo eliminar. */ public boolean elimina(Usuario u) { Transaction tx = session().beginTransaction(); try { if (u.esAgente()) { Agente a = (Agente) u.getAgente(); Iterator ser = a.getServicios().iterator(); while (ser.hasNext()) { Servicio s = (Servicio) ser.next(); Query q2 = session().createSQLQuery("select * from mensaje where id_servicio =" + s.getIdServicio() + " order by fecha_de_envio desc").addEntity(Mensaje.class); List<Mensaje> lista = q2.list(); Iterator i2 = lista.iterator(); Query sql3 = session() .createSQLQuery("DELETE FROM registro " + "WHERE id_servicio = :id_servicio") .setInteger("id_servicio", s.getIdServicio()); sql3.executeUpdate(); while (i2.hasNext()) { session().delete((Mensaje) i2.next()); } s.getProgramadors().clear(); s.getAgentes().clear(); s.getRegistros().clear(); Query sql = session() .createSQLQuery("DELETE FROM pide_servicio " + "WHERE id_servicio = :id_servicio") .setInteger("id_servicio", s.getIdServicio()); sql.executeUpdate(); Query sql2 = session() .createSQLQuery("DELETE FROM presta_servicio " + "WHERE id_servicio = :id_servicio") .setInteger("id_servicio", s.getIdServicio()); sql2.executeUpdate(); session().update(s); session().delete(s); } Query sql4 = session() .createSQLQuery("DELETE FROM calificacion " + "WHERE id_calificado = :id_usuario") .setInteger("id_usuario", u.getIdUsuario()); sql4.executeUpdate(); Query sql5 = session() .createSQLQuery("DELETE FROM calificacion " + "WHERE id_calificador = :id_usuario") .setInteger("id_usuario", u.getIdUsuario()); sql5.executeUpdate(); a.getServicios().clear(); session().update(a); session().update(u); session().delete(a); session().delete(u); return true; } else { Programador p = u.getProgramador(); Iterator ser = p.getServicios().iterator(); while (ser.hasNext()) { Servicio s = (Servicio) ser.next(); Query q2 = session().createSQLQuery("select * from mensaje where id_servicio =" + s.getIdServicio() + " order by fecha_de_envio desc").addEntity(Mensaje.class); List<Mensaje> lista = q2.list(); Iterator i2 = lista.iterator(); Query sql3 = session() .createSQLQuery("DELETE FROM registro " + "WHERE id_servicio = :id_servicio") .setInteger("id_servicio", s.getIdServicio()); sql3.executeUpdate(); while (i2.hasNext()) { session().delete((Mensaje) i2.next()); } s.getProgramadors().clear(); s.getAgentes().clear(); s.getRegistros().clear(); Query sql = session() .createSQLQuery("DELETE FROM pide_servicio " + "WHERE id_servicio = :id_servicio") .setInteger("id_servicio", s.getIdServicio()); sql.executeUpdate(); Query sql2 = session() .createSQLQuery("DELETE FROM presta_servicio " + "WHERE id_servicio = :id_servicio") .setInteger("id_servicio", s.getIdServicio()); sql2.executeUpdate(); session().update(s); session().delete(s); } Query sql4 = session() .createSQLQuery("DELETE FROM calificacion " + "WHERE id_calificado = :id_usuario") .setInteger("id_usuario", u.getIdUsuario()); sql4.executeUpdate(); Query sql5 = session() .createSQLQuery("DELETE FROM calificacion " + "WHERE id_calificador = :id_usuario") .setInteger("id_usuario", u.getIdUsuario()); sql5.executeUpdate(); p.getServicios().clear(); session().update(p); session().update(u); session().delete(p); session().delete(u); return true; } } catch (Exception e) { e.printStackTrace(); tx.rollback(); return false; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Metodo para actualizar un servicio y con un usuario. * @param u - Es el usuario del servicio. * @param s - Es el servicio que se desea actualizar. */ public void actualizaServicio(Usuario u, Servicio s) { Transaction tx = session().beginTransaction(); try { session().update(u); session.update(u.getAgente()); session().save(s); } catch (Exception e) { e.printStackTrace(); tx.rollback(); return; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Regresa los mensajes relacionados con el servicio. * @param s - El servicio relacionado a los mensajes. * @return Una lista con los mensajes. */ public List<Mensaje> obtenMensajesServicio(Servicio s) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from mensaje where id_servicio =" + s.getIdServicio() + " order by fecha_de_envio desc").addEntity(Mensaje.class); List<Mensaje> lista = q.list(); return lista; } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { if (!tx.wasCommitted()) tx.commit(); closeSession(); } return null; } /** * Regresa los servicios de la base de datos. * @return - Una lista con todos los servicios. */ public List<Servicio> obtenServicios() { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from servicio").addEntity(Servicio.class); List<Servicio> lista = q.list(); if (!tx.wasCommitted()) { tx.commit(); } return lista; } catch (TransactionException e) { } catch (Exception e) { e.printStackTrace(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Metodo para eliminar un servicio. * @param servicio - Es el servicio a ser eliminado. */ public void eliminarServicio(Servicio servicio) { Transaction tx = session().beginTransaction(); try { for (Object o : servicio.getAgentes()) { Agente agente = (Agente) o; agente.getServicios().remove(servicio); //session().merge(agente); session().update(agente); } for (Object o : servicio.getProgramadors()) { Programador programador = (Programador) o; programador.getServicios().remove(servicio); session().update(programador); } for (Object o : servicio.getRegistros()) { Registro registro = (Registro) o; registro.setServicio(null); session().update(registro); session().delete(registro); } servicio.getAgentes().clear(); servicio.getProgramadors().clear(); servicio.getRegistros().clear(); //servicio = (Servicio) session().merge(servicio); session().update(servicio); session().delete(servicio); if (!tx.wasCommitted()) { tx.commit(); } } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Metodo para buscar un servicio por id. * @param id - El id primario del servicio. * @return El servicio que buscamos o null si no existe. */ public Servicio buscaServicioPorId(int id) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from servicio where id_servicio = :id") .addEntity(Servicio.class).setInteger("id", id); Servicio servicio = (Servicio) q.uniqueResult(); if (!tx.wasCommitted()) { tx.commit(); } return servicio; } catch (Exception e) { e.printStackTrace(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Metodo para finalizar un servicio. * @param p - Es el programador que finaliza el servicio. * @param ser - Es el servicio que finalizamos. * @return mostrarServicio si se pudo finalizar con xito. */ public String finalizaServicio(Programador p, Servicio ser) { Transaction tx = session().beginTransaction(); try { ser.getProgramadors().add(p); ser.setFinalizado(true); p.getServicios().add(ser); session().update(ser); } catch (Exception e) { e.printStackTrace(); tx.rollback(); return "error"; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return "mostrarServicio"; } /** * Metodo para buscar un agente en la base de datos. * @param a - Es el agente a buscar. * @return El agente de la base o null si no existe. */ public Agente buscaAgente(Agente a) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from agente where id_Agente = :id").addEntity(Agente.class) .setInteger("id", a.getIdAgente()); return (Agente) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Metodo para buscar un programador en la base de datos. * @param programador - Es el programador a buscar. * @return Es el programador de la base o null si no existe. */ public Programador buscaProgramador(Programador programador) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery("select * from programador where id_Programador = :id") .addEntity(Programador.class).setInteger("id", programador.getIdProgramador()); return (Programador) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return null; } /** * Metodo para obtener una lista de servicios con una condicin. * @param cond - La condicin que buscamos. * @return Una lista con los servicios que cumplen las condiciones. */ public List<Servicio> obtenServicios(String cond) { Transaction tx = session().beginTransaction(); try { Query q = session().createSQLQuery( "select * from servicio as srv where lower(srv.titulo) LIKE :titulo or lower(srv.description) LIKE :description") .addEntity(Servicio.class).setString("titulo", "%" + cond.toLowerCase() + "%") .setString("description", "%" + cond.toLowerCase() + "%"); List<Servicio> lista = q.list(); if (!tx.wasCommitted()) { tx.commit(); } return lista; } catch (Exception e) { tx.commit(); e.printStackTrace(); tx.rollback(); return null; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * Metodo para bloquear un usuario. * @param usuario - El usuario que desea bloquear. * @param u - El usuario que se desea bloquear. * @return servicio si se bloqueo con exito. */ public String bloquear(Usuario usuario, Usuario u) { Usuario pet, dang; pet = buscaUsuario(usuario.getIdUsuario()); dang = buscaUsuario(u.getIdUsuario()); Transaction tx = session().beginTransaction(); try { Query sql = session().createSQLQuery("INSERT INTO bloqueados" + "(id_bloqueado,id_bloqueador) VALUES(" + dang.getIdUsuario() + "," + pet.getIdUsuario() + ")"); sql.executeUpdate(); return "servicio"; } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); return "error"; } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } } /** * El usuario calificador califica al calificado * (Se inserta en la base de datos) * @param calificador - El usuario que califica. * @param calificado - El usuario que es calificado. * @param calificacion - La calificacin del usuario. * @return el perfil del usuario que se est calificando. */ public String califica(Usuario calificador, Usuario calificado, double calificacion) { if (calificacion < 1 || calificacion > 5) { return "error"; } /* Lo usamos para saber si hay resultados */ Object hayResultados = null; Transaction tx = session().beginTransaction(); /* Lista de calificaciones */ List<Double> lista; try { /*Aqu se ve si hay calificacin */ Query busca = session() .createSQLQuery("select * from " + "calificacion where id_calificado = :id and id_calificador" + " = :id2") .setInteger("id", calificado.getIdUsuario()).setInteger("id2", calificador.getIdUsuario()); hayResultados = busca.uniqueResult(); if (hayResultados != null) { /* Si hay calificacin, se borra esta */ Query borra = session() .createSQLQuery("DELETE FROM " + "calificacion WHERE id_calificado = :id and " + "id_calificador = :id2") .setInteger("id", calificado.getIdUsuario()).setInteger("id2", calificador.getIdUsuario()); borra.executeUpdate(); } /* Se inserta */ Query inserta = session().createSQLQuery("INSERT INTO calificacion" + "(id_calificador ,id_calificado, calificacion) VALUES(" + calificador.getIdUsuario() + "," + calificado.getIdUsuario() + "," + Double.toString(calificacion) + ")"); inserta.executeUpdate(); /* Se va a promediar */ Query q = session() .createSQLQuery("select calificacion from " + "calificacion where id_calificado = :id") .addScalar("calificacion", StandardBasicTypes.DOUBLE) .setInteger("id", calificado.getIdUsuario()); /* La reputacin nueva del Usuario */ lista = q.list(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); return "error"; } finally { closeSession(); } /* Estpido hibernate hace que mi cdigo se vea feo y me obliga a actualizar instancias despus de la transaccin */ if (calificado.esAgente()) { /* La instancia del usuario como agente */ Agente c = calificado.getAgente(); c.setReputacionAgente(promedioLista(lista)); actualizaAgente(c); } else { /* La instancia del usuario como programador */ Programador c = calificado.getProgramador(); c.setReputacionProgramador(promedioLista(lista)); actualizaProgramador(c); } return "perfilAjeno"; } // Saca el promedio de una lista de dobles. private Double promedioLista(List<Double> lista) { Double promedio = 0.0; /* El promedio que vamos a regresar */ for (Double d : lista) { promedio += d; } promedio /= lista.size(); return promedio; } /** * Saca el promedio de la calificacin del Agente y lo actualiza en la base * de datos * @param p - Es el agente a promediar su calificacin. */ public void promediaAgente(Agente p) { Transaction tx = session().beginTransaction(); try { Query q = session() .createSQLQuery("select avg(calificacion) from " + "calificacion where id_calificado = :id") .addScalar("calificacion", StandardBasicTypes.DOUBLE) .setInteger("id", p.getUsuario().getIdUsuario()); /* La reputacin nueva del Agente */ double promedio = (Double) q.uniqueResult(); p.setReputacionAgente(promedio); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } actualizaAgente(p); } /** * Saca el promedio de la calificacin del Programador y lo actualiza en la base * de datos * @param p - Es el programador a promediar su calificacin. */ public void promediaProgramador(Programador p) { Transaction tx = session().beginTransaction(); try { Query q = session() .createSQLQuery("select avg(calificacion) from " + "calificacion where id_calificado = :id") .addScalar("calificacion", StandardBasicTypes.DOUBLE) .setInteger("id", p.getUsuario().getIdUsuario()); /* La reputacin nueva del Programador */ double promedio = (Double) q.uniqueResult(); p.setReputacionProgramador(promedio); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } actualizaProgramador(p); } /** * Nos dice si el calificador ya calific al calificado. * @param calificador - Es que califica. * @param calificado - Es el que est siendo calificado. * @return true si ya lo calific antes. */ public boolean hayCalificacion(Usuario calificador, Usuario calificado) { Transaction tx = session().beginTransaction(); /* Lo usamos para saber si hay resultados */ Object hayResultados = null; try { Query q = session() .createSQLQuery("select * from " + "calificacion where id_calificado = :id and id_calificador" + " = :id2") .setInteger("id", calificado.getIdUsuario()).setInteger("id2", calificador.getIdUsuario()); hayResultados = q.uniqueResult(); if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx.rollback(); } finally { if (!tx.wasCommitted()) { tx.commit(); } closeSession(); } return (hayResultados != null); } /** * Borra una calificacin existente. * @param calificador - Es el usuario que califica. * @param calificado - Es el usuario calificado. */ public void borraCalificacion(Usuario calificador, Usuario calificado) { Transaction tx2 = session().beginTransaction(); try { Query sql = session() .createSQLQuery( "DELETE FROM calificacion" + "WHERE id_calificado = :id and id_calificador = :id2") .setInteger("id", calificado.getIdUsuario()).setInteger("id2", calificador.getIdUsuario()); sql.executeUpdate(); } catch (Exception e) { e.printStackTrace(); // Lo mantengo para revisar el log. tx2.rollback(); } finally { if (!tx2.wasCommitted()) { tx2.commit(); } closeSession(); } } }//Fin de OperacionesDAO.java