Upload
horatio-cain
View
216
Download
0
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/