motor.MOTOR.java Source code

Java tutorial

Introduction

Here is the source code for motor.MOTOR.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package motor;

import org.hibernate.Session;
import org.hibernate.Transaction;
import hibernate.Cliente;
import hibernate.Coche;
import hibernate.CocheCliente;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.ObjectNotFoundException;
import org.hibernate.PropertyValueException;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.StaleStateException;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.exception.GenericJDBCException;
import org.hibernate.exception.SQLGrammarException;
import org.hibernate.id.IdentifierGenerationException;

/**
 * Clase que carga el driver para conecarse a SQL en memoria, establece la
 * conexion, y modifica, inserta borrar registros.
 *
 * @author Cosmin Firsov
 */
public class MOTOR {
    // Se obtiene la instancia de fbrica de sesiones
    SessionFactory fabricaSesiones = SessionFactoryUtil.getSessionFactory();
    // Se crea una sesin
    Session sesion = (Session) fabricaSesiones.openSession();
    // Se inicia una transaccin en la sesin creada

    /**
     * Mtodo que inserta una registro en la tabla cliente. Utiliza operaciones
     * elementales
     *
     * @param cliente el coche a insertar
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos.
     */
    public void insertarCliente(Cliente cliente) throws ExceptionMotor {
        // Se inicia una transaccin en la sesin creada
        Transaction t = sesion.beginTransaction();

        try {

            sesion.save(cliente);
            // Se confirma la transaccin
            t.commit();
        } catch (IdentifierGenerationException igEx) {
            ExceptionMotor ex = new ExceptionMotor();
            throw ex;
        } catch (ConstraintViolationException igEx) {
            ExceptionMotor ex = new ExceptionMotor();
            if (igEx.getErrorCode() == 2290) {
                ex.setCodigoErrorAdministrador(igEx.getErrorCode());
                ex.setSentenciaSQL(igEx.getSQL());
                ex.setMensajeErrorUsuario(
                        "Error. El campo telefono debe empezar por 6 o 9 y contener 9 caracteres numricos y el email debe acabar en .com o .es");
                ex.setMensajeErrorAdministrador(igEx.getMessage());
            } else {
                ex.setCodigoErrorAdministrador(igEx.getErrorCode());
                ex.setSentenciaSQL(igEx.getSQL());
                ex.setMensajeErrorUsuario("Error. Los siguientes campos son nicos: dni, email y telefono");
                ex.setMensajeErrorAdministrador(igEx.getMessage());
            }
            throw ex;
        } catch (PropertyValueException pvEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario(
                    "Error. Los siguientes campos son obligatorios: nombre, apellido1, email, telefono, dni");
            ex.setMensajeErrorAdministrador(pvEx.getMessage());
            throw ex;
        } catch (SQLGrammarException sqlEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(sqlEx.getErrorCode());
            ex.setSentenciaSQL(sqlEx.getSQL());
            ex.setMensajeErrorUsuario("Error. El campo telefono es un campo numerico");
            ex.setMensajeErrorAdministrador(sqlEx.getMessage());

            throw ex;
        } catch (GenericJDBCException jdbcEx) {
            ExceptionMotor ex = new ExceptionMotor();
            if (jdbcEx.getErrorCode() == 20004) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El taller esta cerrado");
                ex.setMensajeErrorAdministrador(jdbcEx.getMessage());
            }
            if (jdbcEx.getErrorCode() == 20005) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El email debe acabar por .com o .es");
                ex.setMensajeErrorAdministrador(jdbcEx.getMessage());
            }
            if (jdbcEx.getErrorCode() == 20006) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El campo telefono es un campo numerico de 9 caracteres");
                ex.setMensajeErrorAdministrador(jdbcEx.getMessage());
            }

            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

    }

    /**
     * Mtodo que elimina registros de una base de datos. Elimina un cliente
     * buscandolo por su identificador de coche.Utiliza operaciones elementales
     *
     * @param clienteId: el identificador del cliente a eliminar
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public void eliminarClientes(BigDecimal clienteId) throws ExceptionMotor {
        Transaction t = sesion.beginTransaction();

        //Se crea un objeto Cliente transitorio
        Cliente cliente = new Cliente(clienteId, "", "", "", "", "");

        try {

            sesion.delete(cliente);
            // Se confirma la transaccin
            t.commit();

        } catch (StaleStateException ssEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. El identificador de cliente no existe");
            ex.setMensajeErrorAdministrador(ssEx.getMessage());

            throw ex;
        } catch (ConstraintViolationException igEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(igEx.getErrorCode());
            ex.setSentenciaSQL(igEx.getSQL());
            ex.setMensajeErrorUsuario("Error. Hay coches asociados a este cliente");
            ex.setMensajeErrorAdministrador(igEx.getMessage());

            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

    }

    /**
     * Mtodo que modifica los registros de un cliente ya existente. Utiliza
     * operaciones elementales
     *
     * @param cliente los datos del coche a modificar
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public void modificarCliente(Cliente cliente) throws ExceptionMotor {
        Transaction t = sesion.beginTransaction();

        try {

            sesion.update(cliente);
            // Se confirma la transaccin
            t.commit();

        } catch (ConstraintViolationException cvEx) {
            ExceptionMotor ex = new ExceptionMotor();

            if (cvEx.getErrorCode() == 2290) {
                ex.setCodigoErrorAdministrador(cvEx.getErrorCode());
                ex.setSentenciaSQL(cvEx.getSQL());
                ex.setMensajeErrorUsuario(
                        "Error. El campo telefono debe empezar por 6 o 9 y contener 9 caracteres numricos y el email debe acabar en .com o .es");
                ex.setMensajeErrorAdministrador(cvEx.getMessage());

            } else {
                ex.setCodigoErrorAdministrador(cvEx.getErrorCode());
                ex.setSentenciaSQL(cvEx.getSQL());
                ex.setMensajeErrorUsuario("Error. Los siguientes campos son unicos: dni, email y telefono");
                ex.setMensajeErrorAdministrador(cvEx.getMessage());
            }
            throw ex;
        } catch (PropertyValueException pvEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario(
                    "Error. Los siguientes campos son obligatorios: nombre, apellido1, email, telefono, dni");
            ex.setMensajeErrorAdministrador(pvEx.getMessage());

            throw ex;
        } catch (SQLGrammarException sqlEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(sqlEx.getErrorCode());
            ex.setSentenciaSQL(sqlEx.getSQL());
            ex.setMensajeErrorUsuario("Error. El telefono es un campo numerico");
            ex.setMensajeErrorAdministrador(sqlEx.getMessage());

            throw ex;
        } catch (GenericJDBCException jdbcEx) {
            ExceptionMotor ex = new ExceptionMotor();

            if (jdbcEx.getErrorCode() == 20004) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El taller esta cerrado");
                ex.setMensajeErrorAdministrador(jdbcEx.getMessage());
            }
            if (jdbcEx.getErrorCode() == 20005) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El email debe acabar por .com o .es");
                ex.setMensajeErrorAdministrador(jdbcEx.getMessage());
            }
            if (jdbcEx.getErrorCode() == 20006) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El campo telefono es un campo numerico de 9 caracteres");
                ex.setMensajeErrorAdministrador(jdbcEx.getMessage());
            }
            throw ex;
        } catch (StaleStateException ssEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. No existe ese cliente");

            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

    }

    /**
     * Mtodo que ejecuta una select en una base de datos. Lee los datos de un
     * coche buscandolo por su identificador de coche. Utiliza operaciones
     * elementales
     *
     * @param clienteId el identificador de cliente
     * @return devuelve el cliente con cliente_id = clienteId
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public Cliente leerCliente(BigDecimal clienteId) throws ExceptionMotor {

        Cliente cliente = null;
        Cliente clienteAux = new Cliente();

        try {
            // Se busca el registro en cuestin y se carga en un objeto de clase Regions
            cliente = (Cliente) sesion.load(Cliente.class, clienteId);

            //Clono el objeto cliente para que al cerrar la sesin no lo pierda
            if (cliente != null) {
                clienteAux.setClienteId(cliente.getClienteId());

                clienteAux.setNombre(cliente.getNombre());

                clienteAux.setApellido1(cliente.getApellido1());

                clienteAux.setApellido2(cliente.getApellido2());

                clienteAux.setEmail(cliente.getEmail());

                clienteAux.setTelefono(cliente.getTelefono());

                clienteAux.setDni(cliente.getDni());
            }

        } catch (ObjectNotFoundException onfEx) {
            // Se capturar esta excepcin en el caso de que el registro buscado no exista
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. El cliente no existe");
            ex.setMensajeErrorAdministrador(onfEx.getMessage());

            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

        return clienteAux;
    }

    /**
     * Mtodo que ejecuta una select en una base de datos. Lee todos los coches
     * que hay y los devuelve en un ArrayList. Utiliza query HQL
     *
     * @return un ArrayList de clientes
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public ArrayList<Cliente> leerClientes() throws ExceptionMotor {
        ArrayList<Cliente> clientesAux = new ArrayList();
        ArrayList<Cliente> clientes = new ArrayList();

        try {
            // Se crea la query HQL
            Query q = sesion.createQuery("from Cliente");

            clientesAux = (ArrayList) q.list();
            clientes = (ArrayList) clientesAux.clone();
        } catch (ObjectNotFoundException onfEx) {
            // Se capturar esta excepcin en el caso de que el registro buscado no exista
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. No existe ese cliente");
            ex.setMensajeErrorAdministrador(onfEx.getMessage());

            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

        return clientes;
    }

    /**
     * Mtodo que ejecuta una select en una base de datos. Lee todos los
     * clientes que hay atendiendo a un filtro y un orden y los devuelve en un
     * ArrayList. Usa query HQL parametrizada
     *
     * @param filtro Un array de dos dimensiones. En la primera posicion se
     * introduce el campo filtro. Debe ser parte de una sentencia sql, formara
     * parte de la clausula where y en dicha clausula se podran incorporar la
     * condicion que se desee atendiendo a los nombres de cada campo que se
     * quiera ver. Valores que se pueden introducir: clienteId, nombre,
     * apellido1, apellido2, email, telefono, dni. En la segunda posicion se
     * introduce el filtro a buscar por el usuario
     * @param orden debe ser parte de una sentencia sql, formara parte de la
     * clausula order by y en dicha clausula se podran incorporar la condicion
     * que se desee para conseguir el orden deseado. Valores que se pueden
     * introducir:clienteId, nombre, apellido1, apellido2, email, telefono, dni.
     * ej: order by nombre. Adems, se puede aadir ascend or descend al final
     * para indicar si el orden es ascendente o descendente
     * @return un ArrayList de cliente con todos los clientes
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public ArrayList<Cliente> leerClientes(String[] filtro, String orden) throws ExceptionMotor {
        ArrayList<Cliente> clientesAux = new ArrayList<>();
        ArrayList<Cliente> clientes = new ArrayList<>();

        try {
            // Se crea la query HQL
            Query q = sesion.createQuery("from Cliente where " + filtro[0] + " = :filtro order by " + orden);
            q.setString("filtro", filtro[1]);

            clientesAux = (ArrayList) q.list();
            clientes = (ArrayList) clientesAux.clone();

        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

        return clientes;
    }

    /**
     * Mtodo que inserta un registro en la tabla coche. Utiliza operaciones
     * elementales
     *
     * @param coche El objeto coche
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public void insertarCoche(Coche coche) throws ExceptionMotor {
        // Se inicia una transaccin en la sesin creada
        Transaction t = sesion.beginTransaction();

        try {

            sesion.save(coche);
            // Se confirma la transaccin
            t.commit();
        } catch (PropertyValueException pvEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. Todos los campos son obligatorios");
            ex.setMensajeErrorAdministrador(pvEx.getMessage());

            throw ex;

        } catch (ConstraintViolationException igEx) {
            ExceptionMotor ex = new ExceptionMotor();

            if (igEx.getErrorCode() == 2291) {
                ex.setCodigoErrorAdministrador(igEx.getErrorCode());
                ex.setSentenciaSQL(igEx.getSQL());
                ex.setMensajeErrorUsuario("Error. No existe ese cliente");
                ex.setMensajeErrorAdministrador("VIOLACION DE CHECK CONSTRAINT");
            } else if (igEx.getErrorCode() == 1) {
                ex.setCodigoErrorAdministrador(igEx.getErrorCode());
                ex.setSentenciaSQL(igEx.getSQL());
                ex.setMensajeErrorUsuario("Error. Los siguientes campos son unicos: matricula");
                ex.setMensajeErrorAdministrador("VIOLACION DE UNIQUE KEY");
            }
            throw ex;

        } catch (GenericJDBCException gjdbcEx) {
            ExceptionMotor ex = new ExceptionMotor();

            if (gjdbcEx.getErrorCode() == 20002) {
                ex.setCodigoErrorAdministrador(gjdbcEx.getErrorCode());
                ex.setSentenciaSQL(gjdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. La ITV debe estar pasada");
                ex.setMensajeErrorAdministrador("VIOLACION DE TRIGGER ITV_PASADA");
            }
            if (gjdbcEx.getErrorCode() == 20004) {
                ex.setCodigoErrorAdministrador(gjdbcEx.getErrorCode());
                ex.setSentenciaSQL(gjdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El taller esta cerrado");
                ex.setMensajeErrorAdministrador("VIOLACION DE TRIGGER TALLER_ABIERTO");
            }
            throw ex;

        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

    }

    /**
     * Mtodo que elimina una fila de una base de datos. Elimina un coche
     * buscandolo por su identificador de coche. Utiliza HQL
     *
     * @param cocheId el identificador del coche a eliminar
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public void eliminarCoche(int cocheId) throws ExceptionMotor {
        // Se inicia una transaccin en la sesin creada
        Transaction t = sesion.beginTransaction();

        // Se crea la query HQL
        Query q = sesion.createQuery("delete Coche where cocheId = " + cocheId);
        try {
            int registrosAfectados = q.executeUpdate();

            // Se confirma la transaccin
            t.commit();
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

    }

    /**
     * Mtodo que modifica los datos de un coche ya existente. Usa HQL
     * parametrizado
     *
     * @return el numero de registros afectados
     * @param coche el objeto coche con los datos a modificar
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public int modificarCoche(Coche coche) throws ExceptionMotor {
        int registrosAfectados = -1;

        // Se inicia una transaccin en la sesin creada
        Transaction t = sesion.beginTransaction();

        // Se crea la query HQL
        Query q = sesion.createQuery("update Coche set cliente.clienteId = :coclienteId,"
                + "marca = :comarca, modelo = :comodelo, matricula = :comatricula , " + "itv = :coitv "
                + "where cocheId = :cococheId");
        q.setString("comarca", coche.getMarca());
        q.setString("comodelo", coche.getModelo());
        q.setString("comatricula", coche.getMatricula());
        q.setDate("coitv", coche.getItv());
        q.setBigDecimal("cococheId", coche.getCocheId());
        q.setBigDecimal("coclienteId", coche.getCliente().getClienteId());

        try {
            // Se ejecuta la query q
            registrosAfectados = q.executeUpdate();

            // Se confirma la transaccin
            t.commit();
        } catch (GenericJDBCException jdbcEx) {
            ExceptionMotor ex = new ExceptionMotor();

            if (jdbcEx.getErrorCode() == 2291) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. No existe ese ciente");
                ex.setMensajeErrorAdministrador("NO SE HA INTRODUCIDO UN COCHE_ID QUE EXISTA");
            }
            if (jdbcEx.getErrorCode() == 1407) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario(
                        "Error. Los siguientes campos son obligastorios: marca, modelo, matricula, itv");
                ex.setMensajeErrorAdministrador("VIOLACION DE NOT_NULL");
            }
            if (jdbcEx.getErrorCode() == 20002) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. La ITV debe estar pasada");
                ex.setMensajeErrorAdministrador("VILACION DE TRIGGER ITV_PASADA");
            }
            if (jdbcEx.getErrorCode() == 20004) {
                ex.setCodigoErrorAdministrador(jdbcEx.getErrorCode());
                ex.setSentenciaSQL(jdbcEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El taller esta cerrado");
                ex.setMensajeErrorAdministrador("VIOLACION DE TRIGGER TALLER ABIERTO");
            }
            throw ex;
        } catch (ConstraintViolationException cvEx) {
            ExceptionMotor ex = new ExceptionMotor();

            if (cvEx.getErrorCode() == 1) {
                ex.setCodigoErrorAdministrador(cvEx.getErrorCode());
                ex.setSentenciaSQL(cvEx.getSQL());
                ex.setMensajeErrorUsuario("Error. El campo matricula es unico");
                ex.setMensajeErrorAdministrador("VIOLACION DE UNIQUE KEY");
            }
            throw ex;
        } catch (StaleStateException ssEx) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. No existe ese coche");
            ex.setMensajeErrorAdministrador("SE HA INTRODUCIDO UN COCHE_ID QUE NO EXISTE");
            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }
        return registrosAfectados;
    }

    /**
     * Metodo que lee un coche buscandolo por su identificador de coche. Usa
     * query HQL
     *
     * @param cocheId el identificador del coche
     * @return un coche Coche
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public Coche leerCoche(int cocheId) throws ExceptionMotor {

        Coche coche = new Coche();
        Coche cocheAux = new Coche();

        try {
            // Se crea la query HQL
            Query q = sesion.createQuery("from Coche where cocheId=" + cocheId);
            coche = (Coche) q.uniqueResult();
            if (coche != null) {
                cocheAux.setCliente(coche.getCliente());

                cocheAux.setCocheId(coche.getCocheId());

                cocheAux.setItv(coche.getItv());

                cocheAux.setMarca(coche.getMarca());

                cocheAux.setMatricula(coche.getMatricula());

                cocheAux.setModelo(coche.getModelo());
            }

        } catch (ObjectNotFoundException onfEx) {
            // Se capturar esta excepcin en el caso de que el registro buscado no exista
            ExceptionMotor ex = new ExceptionMotor();

            ex.setMensajeErrorUsuario("Error. El registro no existe");
            ex.setMensajeErrorAdministrador("EL REGISTRO NO EXISTE");

            throw ex;
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

        return cocheAux;

    }

    /**
     * Metodo que devuelve todos los coches con sus respectivos clientes. Usa
     * query HQL
     *
     * @return todos los coches
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public ArrayList<CocheCliente> leerCoches() throws ExceptionMotor {
        ArrayList<CocheCliente> coches = new ArrayList();

        try {
            // Se crea la query HQL
            Query q = sesion.createQuery("select new hibernate.CocheCliente"
                    + "(cl.clienteId, cl.nombre, cl.apellido1, cl.apellido2, "
                    + "cl.email, cl.telefono, cl.dni, co.cocheId, co.marca," + " co.modelo, co.matricula, co.itv)"
                    + " from Coche co, Cliente cl " + "where co.cliente.clienteId = cl.clienteId");

            CocheCliente cocheCliente;

            List<CocheCliente> lista = q.list();

            Iterator<CocheCliente> iterador = lista.iterator();

            while (iterador.hasNext()) {
                coches.add(iterador.next());
            }
        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

        return coches;
    }

    /**
     * Mtodo que ejecuta una select en una base de datos. Lee todos los coches
     * que hay atendiendo a un filtro y un orden y los devuelve en un ArrayList.
     * Usa query HQL parametrizada
     *
     * @param filtro Un array de dos dimensiones. En la primera posicion se
     * introduce el campo filtro. Debe ser parte de una sentencia sql, formara
     * parte de la clausula where y en dicha clausula se podran incorporar la
     * condicion que se desee atendiendo a los nombres de cada campo que se
     * quiera ver. Valores que se pueden introducir: cocheId, marca, modelo,
     * matricula, itv. En la segunda posicion se introduce el filtro a buscar
     * por el usuario
     * @param orden debe ser parte de una sentencia sql, formara parte de la
     * clausula order by y en dicha clausula se podran incorporar la condicion
     * que se desee para conseguir el orden deseado. Valores que se pueden
     * introducir:cocheId, marca, modelo, matricula, itv. ej: order by nombre.
     * Adems, se puede aadir ascend or descend al final para indicar si el
     * orden es ascendente o descendente
     * @return un ArrayList de coche con todos los coches
     * @throws ExceptionMotor excepcion que integra el mensaje de error al
     * usuario, el codigo de error y el mensaje de error que nos ha devuelto la
     * base de datos
     */
    public ArrayList<Coche> leerCoches(String[] filtro, String orden) throws ExceptionMotor {
        ArrayList<Coche> cochesAux = new ArrayList<>();
        ArrayList<Coche> coches = new ArrayList<>();
        // Se obtiene la instancia de fbrica de sesiones
        //filtra solo por el DNI y el email, y el orden se aade al final sin 

        try {
            // Se crea la query HQL
            Query q = sesion.createQuery("from Coche where " + filtro[0] + " = :filtro order by " + orden);
            q.setString("filtro", filtro[1]);

            cochesAux = (ArrayList) q.list();
            coches = (ArrayList) cochesAux.clone();

        } catch (Exception e) {
            ExceptionMotor ex = new ExceptionMotor();

            ex.setCodigoErrorAdministrador(0);
            ex.setMensajeErrorUsuario("Error general en el sistema, Consulte con el administrador");
            ex.setMensajeErrorAdministrador(e.getMessage());

            throw ex;
        }

        return coches;

    }

    public void cerrarSesion() {
        // Se cierra la sesin
        sesion.close();
        //Se cierra la fbrica de sesiones
        fabricaSesiones.close();
    }
}