Hibernando

Embed Size (px)

Citation preview

  • 7/28/2019 Hibernando

    1/36

    pablomonteserin.compablomonteserin.com

    Hibernate

    Disminuye la cantidad de cdigo usado.

    Simplifica la interaccin con la base de datos.

    Optimiza el acceso a la base de datos.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    2/36

    pablomonteserin.compablomonteserin.com

    ORM

    Object Relational Mapping. Se encarga detransformar las tablas en clases, los campos enpropiedades y viceversa.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    3/36

    pablomonteserin.compablomonteserin.com

    Clave primaria

    Usando Hibernate:- es fundamental que las tablas tengan claveprimaria.- no es posible modificar claves primarias.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    4/36pablomonteserin.compablomonteserin.com

    Usaremos el plugin para eclipse:Hibernate Tools

    Help -> Install new software -> (ojo!!!! no introducir esta url en elwork with) add -> pegamos ->

    http://download.jboss.org/jbosstools/updates/development/indigo

    - Marcamos, dentro de JBoss Data Services:Hibernate Tools

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    5/36pablomonteserin.compablomonteserin.com

    Descargar las libreras dehibernate

    http://hibernate.org/downloads

    Enlace final:http://sourceforge.net/projects/hibernate/files/hibernate3/

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    6/36pablomonteserin.compablomonteserin.com

    Jar que hay que aadir

    Los siguientes ejercicios son proyectos java comunes. Paracargar las libreras crearemos una carpeta lib dentro de losmismos y cargaremos las libreras de ah (botn derechosobre el proyecto properties java build path libraries add Jar)

    hibernate-distribution-3.6.0.Final/Hibernate3.jarhibernate-distribution-3.6.0.Final/lib/jpa/*hibernate-distribution-3.6.0.Final/lib/required/*

    Mysqlconnector

    En total hay que aadir 9 jars.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    7/36pablomonteserin.compablomonteserin.com

    hibernate.cfg.xml

    Lo ms cmodo es copiarlo de otro proyecto, envez de generarlo nosotros.Debe estar en la raz de la carpeta src.falsecom.mysql.jdbc.Driver2password10jdbc:mysql://localhost/pruebasrootmanagedorg.hibernate.dialect.MySQLDialecttrue

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    8/36pablomonteserin.compablomonteserin.com

    Nomenclatura de tablas cuandotrabajemos con Hibernate

    Las palabras del nombre de la tabla se separancon guin bajo. Luego hibernate cambiar dicho _por la siguiente letra en mayscula.

    Ya que las tablas se convertirn en clases, seescriben en singular.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    9/36

    pablomonteserin.compablomonteserin.com

    Configuracin de consola

    Btn derecho sobre el paquete -> run as -> Run configurations -> HibernateConsole Configuration -> new configuration

    Pestaa MainPestaa MainProyect: nombre del proyecto.Configuration file: setup y busco el archivo hibernate.cfg.xml deConfiguracin.

    Pestaa ClassPath:Pestaa ClassPath:Me aseguro de que estn cargadas las 9 libreras indicadas en ladiapositiva anterior.

    Si cuando me creo un proyecto tengo las libreras en el classpath (en el caso deun proyecto web, en la carpeta lib), no ser necesario aadirlas en estapestaa, puesto que ya estn en el classpath.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    10/36

    pablomonteserin.compablomonteserin.com

    Hibernate Code Generation Configurations

    Hay que estar en perspectiva Java.Icono con desplegable de Hibernate -> Hibernate Code Generation Configurations

    Pestaa Main:Pestaa Main:Console configuration: Selecciono la configuracin de consola previamente

    creada.Output directory -> NombreDelProyecto/src.Reverse engineer from JDBC Connection -> Marco la checkPackage: com.pablomonteserin.POJO

    Pestaa Exporters:Pestaa Exporters:Marco las checks Domain code, Hibernate XML Mappings, Hibernate XML

    Configuration.

    RunRunEsto crea una clase por cada tabla de mi base de datos, as como un get y set por cadacolumna.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    11/36

    pablomonteserin.compablomonteserin.com

    Errores tpicos en la generacinde clases

    Exception while generating code.Exception while generating code.Reason:Reason:

    java.lang.NullPointerExceptionjava.lang.NullPointerExceptionTodas las tablas deben tener clave primaria.

    Exception while generating code.Exception while generating code.

    Reason:Reason:org.hibernate.console.HibernateConsoleRuntimeException. Problems whileorg.hibernate.console.HibernateConsoleRuntimeException. Problems whileloading database driver class(com.mysql.jdbc.Driver.)loading database driver class(com.mysql.jdbc.Driver.)En runc run configurations Hibernate Console Configuration faltan por aadir laslibreras de hibernate y el driver de mysql

    Exception while generating code.Exception while generating code.

    Reason:Reason:org.hibernate.tool.hbm2x.ExporterException: File pattern not set on classorg.hibernate.tool.hbm2x.ExporterException: File pattern not set on classorg..tool.hbm2x.GenericExporterorg..tool.hbm2x.GenericExporterEn HibernateCodeGenerationConfigurations Exporters, marcar los exporters para losque est configurada la generacin:- Domain code (.java)- Generic Exporter ()

    - Hibernate XML Configuration (.cfg.xml)

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    12/36

    pablomonteserin.compablomonteserin.com

    Mapeos de Hibernate enhibernate.cfg.xml

    Las tablas de hibernate son mapeadas a ficheros *.hbm.xml. Si el archivohibernate.cfg.xml tiene una referencia a dichos mapeos y no los encuentrafsicamente en el equipo, dar un error.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    13/36

    pablomonteserin.compablomonteserin.com

    Hibernate API

    http://docs.jboss.org/hibernate/core/3.5/javadocs/

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    14/36

    pablomonteserin.compablomonteserin.com

    Transacciones

    Conjunto de operaciones contra la base de datos que serealizan de forma atmica (o todas o ninguna).

    Cuando nos interesa crear una transaccin?Cuando modificamos la base de datos (y por tantodeseamos poder hacer rollback()). Para una consulta noes necesario. Crear una transaccin consume recursos.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    15/36

    pablomonteserin.compablomonteserin.com

    EjemploSessionFactory, Session, Transaction

    - La llamada a Configuration().configure()Configuration().configure() carga el fichero de configuracin hibernate.cfg.xml. -- Normalmente, el ejemplar de SessionFactory slo se crea una vez y luego se utiliza para creartodas las sesiones relacionadas con un contexto dado.- Un objeto Session Hibernate representa una nica unidad-de-trabajo y es abierta por unUn objeto Session Hibernate representa una nica unidad-de-trabajo y es abierta por unejemplar de SessionFactory.ejemplar de SessionFactory.Se deben cerrar las sesiones cuando se haya completado todo elSe deben cerrar las sesiones cuando se haya completado todo eltrabajo de una transacin.trabajo de una transacin.

    - En caso de fallo, lo que hay dentro del beginTransaction y el commit no se ejecuta y se salta a uncatch.- Siempre es ms rpido hacer dos operaciones en una sola transaccin que dos operaciones endos transacciones.

    public static void main(String[] args) {System.out.println("en Test1.main");Autor a = new Autor(5, "autor1");

    SessionFactory sessionFactory = new Configuration().configure()new Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession();Session session = sessionFactory.openSession();session.beginTransaction();session.beginTransaction();session.save(a);session.getTransaction().commit();session.close();session.close();

    }

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    16/36

    pablomonteserin.compablomonteserin.com

    session.flush()

    Este mtodo se asegura de que la informacin ha sidopersistida en la base de datos, de forma que ya sea posiblecerrar con seguridad la session.

    Este mtodo es ejecutado automticamente por

    session.close(), no obstante es recomendable que siemprelo ejecutemos explcitamente justo antes.

    Puede ser til hacer un flush para recuperar la idautoincrementada de un objeto recien insertado. Ejemplo:Session.save(persona);Session.flush();Id = persona.getId();

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    17/36

    pablomonteserin.compablomonteserin.com

    Mtodos de la clase Session

    session.save(persona) // guarda un objeto como registro en la base de datos.Session.refresh(persona) // en nos permitir conocer la id del objeto insertado,suponiendo que la id sea autoincrementada.session.update(persona);session.saveOrUpdate(persona);

    session.get(Persona.class, id) -> me permite recuperar datos.

    // el mtodo load lo usamos slo para borrar un paciente. ya que nos devuelveun paciente slo con la clave primaria seteada. Para recuperar todos los valoresusaremos get.Persona personaABorrar = (Persona) session.load(Persona.class, idPaciente);session.delete(personaABorrar);

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    18/36

    pablomonteserin.compablomonteserin.com

    Definir claves forneas con sql

    El siguiente cdigo SQL genera una relacin 1 a muchos:

    ALTER TABLE libro ADD CONSTRAINT fk_autor FOREIGN KEY ( idAutor ) REFERENCES autor( id )ALTER TABLE libro ADD CONSTRAINT fk_autor FOREIGN KEY ( idAutor ) REFERENCES autor( id )

    El cdigo para generar una relacin uno a uno sera igual, pero cambiando los nombres de los campos alos que hago referencia:

    ALTER TABLE autor ADD FOREIGN KEY ( id ) REFERENCES padre_autor (id)

    Nota:Nota:Para asignar las foreing keys es necesario que:- los tipos de datos de los campos relacionados coincidan.- Las tablas deberan estar vacas, u obtendremos un error del tipo "Table already exists".- El motor de las tablas sea InnoDB.

    libroidid_autortitulo

    autor

    idnombre

    1 n

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    19/36

    pablomonteserin.compablomonteserin.com

    Ejercicio crear base de datos

    libroid

    id_autortitulo

    autor

    idnombre

    1 n

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    20/36

    pablomonteserin.compablomonteserin.com

    Crear una relacin n a n

    Una relacin n a n son dos relaciones 1 a nvinculadas a una misma tabla auxiliar. MySQLWorkBench, desde la ventana de diagramas EERnos permite crear automticamente relaciones n a n,de forma que se crear automticamente la tablaintermedia.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    21/36

    pablomonteserin.compablomonteserin.com

    Insertar slo un autor

    public static void main(String[] args) {System.out.println("en Test1.main");

    Autor a = new Autor("juan", new HashSet());SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();session.save(a);session.getTransaction().commit();session.close();

    }

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    22/36

    pablomonteserin.compablomonteserin.com

    Insertar un autor y sus libros

    public static void main(String[] args) {System.out.println("en Test1.main");HashSet libros = new HashSet();Autor a = new Autor("juan", libros);

    Libro l1= new Libro(7, a,"titulox11");Libro l2= new Libro(8, a,"titulox22");SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();session.save(a);session.save(l1);session.save(l2);

    session.getTransaction().commit();session.close();

    }

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    23/36

    pablomonteserin.compablomonteserin.com

    Save en CascadaHabr que aadir el atributo cascade=all al set de libros

    de Autor.hbm.xml

    Set libros = new HashSet();Autor a = new Autor("Robert",libros);

    libros.add(new Libro(33, a, "viajes1"));libros.add(new Libro(34, a, "viajes2"));libros.add(new Libro(35, a, "viajes3"));session.save(a);

    Nota:Nota:De esta forma, al borrar el autor, se borran tambin loslibros.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    24/36

    pablomonteserin.compablomonteserin.com

    Carga perezosa

    Es una estrategia que consiste en demorar la carga de un objeto hasta que estesea requerido.

    Es decir, la carga del objeto se realiza de manera explcita cuando este esinvocado.Lazy loading se utiliza en aquellos casos en los que la aplicacin necesita

    acceder solo a una parte de un objeto, a un subgrafo del objeto, o a algunosatributos de un objeto.

    En general la carga perezosa slo se utiliza en las colecciones 1-n y n-n.Est por defecto a lazy true. Es posible usar cargar perezosas en relaciones 1-1pero no es sencillo ni frecuente.

    Podemos modificar el atributo lazy=true que encontraremos en los set deobjetos (si los hubiese) de los ficheros .hbm.xml.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    25/36

    pablomonteserin.compablomonteserin.com

    Ejercicio

    Hacer una clase Main que contenga tres transacciones querealicen las siguientes operaciones:

    1 Insertar cuatro libros. No hace falta hacerlo por cdigojava; insertar directamente los libros utilizando el gestor de labase de datos.

    2 - Imprimir los libros del autor cuya clave primaria es tres.

    3 Recuperar uno de los libros insertados y modificarlo.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    26/36

    pablomonteserin.compablomonteserin.com

    Mtodos de la clase Criteria

    Consultar una tablaConsultar una tablaCriteria crit = session.createCriteria(Autor.class);List result = crit.list();

    Consultar un nico registroConsultar un nico registrocrit.uniqueResult()

    Consultar toda la base de datosConsultar toda la base de datosCriteria crit = session.createCriteria(java.lang.Object.class)

    Aadir restriccionesAadir restriccionescrit.addOrder(Order.desc(''nombre''));crit.add(Restrictions.eq(''nombre'', ''Juan''));//Por defecto las restricciones se aaden con AND

    crit.add(Restrictions.like(''nombre'',''%ar%''));//Para aadir una restriccin con ORcrit.add(Restrictions.disjunction()Restrictions.disjunction().add(Restrictions.like("nombre", "%c%")));

    Nota:Utilizando Criteria no es necesario hacer commit().

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    27/36

    pablomonteserin.compablomonteserin.com

    Ejercicio

    Insertar 5 libros en la base de datos. Dos registros deben tener elmismo ttulo (''titulo1'').

    Utilizar la clase criteria para mostrar los libros cuyo ttulo contenga lapalabra ''titulo1''.

    Hacer una nueva consulta, ordenando la salida por el ttulo, e irrecorrindola imprimiendo los ttulos y las id con System.out.println();

    ID:1 Ttulo:titulo1

    ID:6 Ttulo:titulo2ID:2 Ttulo:titulo3ID:4 Ttulo:titulo4ID:3 Ttulo:titulo5

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    28/36

    pablomonteserin.compablomonteserin.com

    Consulta con ExampleConsulta con ExampleCreamos un objeto (a) y haremos la consulta a partir de l.Si le pasamos null como parmetro el parmetroSi le pasamos null como parmetro el parmetroes ignorado.es ignorado.

    Autor a = new Autor("raque");

    Example exampleAutor = Example.create(a);exampleAutor.ignoreCase();exampleAutor.enableLike(MatchMode.ANYWHERE);exampleAutor.excludeProperty("id");Criteria crit = session.createCriteria(Autor.class);

    crit.add(exampleAutor);

    ANYWHERE Match the pattern anywhere in the string.END Match the end of the string to the pattern.EXACT Match the entire string to the pattern.START Match the start of the string to the pattern.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    29/36

    pablomonteserin.compablomonteserin.com

    Consulta simpleConsulta simpleQuery hqlQuery = session.createQuery(''FROM Libro''); //recupero una coleccin de objetosQuery hqlQuery2 = session.createQuery("SELECT v.matricula FROM Vehiculo v");//recupero un String en vez de un objeto

    List result = hqlQuery.list();

    Consulta ordenadaConsulta ordenadaQuery hqlQuery = session.createQuery(''FROM Libro ORDER BY id'');List result = hqlQuery.list();

    Consulta con parmetroConsulta con parmetroString queryString = from Libro where nombre like ?;Query hqlQuery = session.createQuery(queryString).setString(0, "%Ro%");

    Consulta con parmetro IIConsulta con parmetro IIString queryString =FROM Hombre WHERE nombre LIKE: textSearch;Query hqlQuery = session.createQuery(queryString).setString("textSearch", "%o%");

    Consulta en el hbmConsulta definida en un mapeo hbm.xmlConsulta definida en un mapeo hbm.xml

    /*La siguiente consulta es recuperada del archivo Simple.hbm.xml. De todas formas,funcionara desde cualquier otro mapeo.En este caso, el cdigo presente en el mapeo es:

    FROM Libro l WHERE l.titulo LIKE :textoBusqueda]]>

    */Query hqlQuery = session.getNamedQuery("findLibroByTitulo").setParameter("textoBusqueda", "%a%");List result = hqlQuery.list();

    Eliminar un registroEliminar un registroString queryString = "delete from Paciente where id=?";Query hqlQuery = session.createQuery(queryString);hqlQuery.setInteger(0, 4);hqlQuery.executeUpdate();

    HQL

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    30/36

    pablomonteserin.compablomonteserin.com

    Evitar inyeccin SQL

    Se debe evitar crear consultas HQL concatenando Strings:Se debe evitar crear consultas HQL concatenando Strings:String queryString ="from item i where i description like ' " + search + " ' ";

    En cambio es aconsejable usar:En cambio es aconsejable usar:Parmetros con nombre:Parmetros con nombre:String queryString = "from Simple where texto like :textSearch";

    Parmetros posicionales:

    String queryString = "from Simple where texto like ?";Query hqlQuery = session.createQuery(queryString);hqlQuery.setString(0, "%1%" );

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    31/36

    pablomonteserin.compablomonteserin.com

    Evaluar si una propiedad del bean es igual a cierto valorEvaluar si una propiedad del bean es igual a cierto valor(no funciona si la propiedad es un set)(no funciona si la propiedad es un set)

    String queryString = '' from Libro l where l.autor.nombre like :textSearch'';Query hqlQuery = session.createQuery(queryString).setString(''textSearch'', ''%n%'');

    Evaluar si uno de los los elementos de la propiedad del bean consultado esEvaluar si uno de los los elementos de la propiedad del bean consultado es

    igual a cierto valorigual a cierto valor

    String queryString = " select a from Autor a join a.libros l where l.titulo='titulox11'";Query hqlQuery = session.createQuery(queryString);

    Nota:

    La siguiente lnea es equivalente a la lnea en verde (pero utilizando join):String queryString = "select l from Libro l join l.autor a where a.nombre='nombre1'";

    Las palabras escritas en rojo son propiedades de las clases, no son campos de labase de datos.

    Consulta relacionada

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    32/36

    pablomonteserin.compablomonteserin.com

    Una consulta HQL que no debo hacer

    select v.matricula, v.marca from Vehiculo v order by v.ruedasselect v.matricula, v.marca from Vehiculo v order by v.ruedas

    En el ejercicio siguiente veremos la forma correcta de hacer estaconsulta para recuperar los valores deseados.

    Si ejecutamos esta consulta y pretendemos recorrera, estaramosrecorriendo una lista de un array de Objects:

    List result = hqlQuery.list();Iterator it = result.iterator();

    while(it.hasNext()){Object[] obj = it.next();System.out.println("Matricula: "+ obj[0]);System.out.println("Marca: "+ obj[1]);

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    33/36

    pablomonteserin.compablomonteserin.com

    EjercicioNo es un proyecto web. Realizar las siguientes consultas:

    - Listar las matrculas de todos los vehculos.

    - Listar la matrcula y la marca de todos los vehculos ordenados por nmero de ruedas.

    - Listar la matrcula de todos los vehculos que tengan ms de dos asientos yy ms de dos ruedas.

    - Listar la matrcula de todos los vehculos que tengan ms de dos asientos oo ms de dos ruedas.

    - Listar la matriula de todos los vehculos que tengan una matriula de menos de seis caracteres (where length(v.matricula)

  • 7/28/2019 Hibernando

    34/36

    pablomonteserin.compablomonteserin.com

    Recuperacin de la session para no tener que instanciarun SessionFactory cada vez que la necesite.

    //Una clase final es una clase que no puede ser extendidafinal public class ConexionProviderSingleton {

    private static SessionFactory sessionFactory;private static Session session;

    //Para evitar que podamos instanciar el Singleton, hacemos su constructor privadoprivate ConexionProviderSingleton(){}public static Session getSession(){

    if(sessionFactory==null){sessionFactory = new Configuration().configure().buildSessionFactory();

    }if(session == null || !session.isOpen())

    session = sessionFactory.openSession();

    return session;}

    }Para recuperar la sesin desde la clase servicio:Session session = ConexionProviderSingleton.getSession();

    Singleton: Es un objeto del que slo puedeexistir una instancia por aplicacin. Dichoobjeto debe ser esttico. Lo recomendablees que el mtodo que devuelva dicho objetoesttico, tambin sea esttico.

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    35/36

    pablomonteserin.compablomonteserin.com

    public class PacienteDAO {public void alta(Paciente paciente){

    try{Session session = ConexionProviderSingleton.getSession();session.save(paciente);

    }catch(Throwable t){//Ojo! Una vez subamos la aplicacin a produccin, no debe existir en ella ningn printStackTrace(); ya que no queremos cargar la consola del servidor contrazas. En su lugar usaremos log4j. Hay que tener en cuenta que printStackTrace() es un mtodo que devuelve void; por tanto no podremos volcarlo ntegro.//Capturo todas las excepciones que creo que pueden ocurrir y finalmente capturo Exception

    }catch(PropertyValueException e){logger.error("ERROR. "+this.getClass().getCanonicalName()+". alta() paciente.id="+ paciente.getId()+"; " + e.getMessage());

    //La siguiente excepcin ser la que llegar a la vista y ver el usuario de la aplicacinthrow new DAOException("Ha habido un error al dar de alta paciente con id " + paciente.getId());

    }catch(Exception e){e.printStackTrace();

    }}

    public class PacienteBO{

    public void alta(Paciente paciente) {Session session = null;Transaction tx = null;try {

    session = ConexionProviderSingleton.getSession();tx = session.beginTransaction();pacienteDAO.alta(paciente);

    } catch (DAOException e) {logger.error("ERROR. "+this.getClass().getCanonicalName()+". alta() paciente.id="+ paciente.getId()+"; " + e.getMessage());throw new BOException(this.getClass().getCanonicalName() + ". alta(): " + e.getMessage());

    }tx.commit();session.close();

    }}

    En el controlador puedo redirigir a una pgina de error dnde pintara el mensaje de error, o pintarlo en alguna zona de la pgina en la que estoy, o mostrar unmensaje emergente, etc.

    Gestin de excepciones

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/
  • 7/28/2019 Hibernando

    36/36

    pablomonteserin.compablomonteserin.com

    Hospital

    La base de datos tendr 4 campos: id(PRIMARY KEY, AUTOINCREMENT),nombre (VARCHAR), apellidos (VARCHAR), fecha_alta(DATE).

    http://www.pablomonteserin.com/http://www.pablomonteserin.com/http://www.pablomonteserin.com/