Está en la página 1de 35

Hibernate

Disminuye la cantidad de cdigo usado.


Simplifica la interaccin con la base de datos.
Optimiza el acceso a la base de datos.

pablomonteserin.com

ORM

Object Relational Mapping. Se encarga de


transformar las tablas en clases, filas en registros
y viceversa.

pablomonteserin.com

Clave primaria

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

pablomonteserin.com

Usaremos el plugin para eclipse:


Hibernate Tools

Help -> Install new software -> (ojo!!!! no introducir esta url en el
work with) add -> pegamos ->
http://download.jboss.org/jbosstools/updates/stable/
- Marcamos, dentro de All Jboss Tools:
Hibernate Tools

pablomonteserin.com

Descargar las libreras de hibernate

http://hibernate.org/downloads
Enlace final:
http://sourceforge.net/projects/hibernate/files/hibernate3/
pablomonteserin.com

pablomonteserin.com

Jar que hay que aadir


Add External jar aade la ruta absoluta:
hibernate-distribution-3.6.0.Final/Hibernate3.jar
hibernate-distribution-3.6.0.Final/lib/jpa/*
hibernate-distribution-3.6.0.Final/lib/required/*
Mysqlconnector
En total hay que aadir 9 jars.

pablomonteserin.com

Hibernate.cfg.xml
Lo ms cmodo es copiarlo de otro proyecto, en
vez de generarlo nosotros.
Debe estar en la raz de la carpeta src.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.isolation">2</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/pruebas</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.current_session_context_class">managed</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/cursos/Simple.hbm.xml" />
</session-factory>
</hibernate-configuration>

pablomonteserin.com

Nomenclatura de tablas cuando


trabajemos con Hibernate
Las palabras del nombre de la tabla se separan
con guin bajo. Luego hibernate cambiar dicho _
por la siguiente letra en mayscula.
Ya que las tablas se convertirn en clases, se
escriben en singular.

pablomonteserin.com

Nomenclatura de tablas cuando


trabajemos con Hibernate
Las palabras del nombre de la tabla se separan
con guin bajo. Luego hibernate cambiar dicho _
por la siguiente letra en mayscula.
Ya que las tablas se convertirn en clases, se
escriben en singular.

pablomonteserin.com

Definir claves forneas en mysql con phpmyadmin


Selecciono la tabla con la clave fornea -> Structure -> Indexes -> go ->
Index name: fk_tablaConClaveForanea_tablaActual
Index type: index
Field: campo que ser clave fornea en esta tabla.

Ojo!
Los campos
relacionados deben
contener informacin
del mismo tipo.
Entramos en relationView de la tabla que contiene la clave foranea para
relacionarla con la tabla que contiene la clave primaria.
Vamos a la combo del campo que ser clave fornea y seleccionamos la clave
Primaria de la propia tabla.
En la combo contigua seleccionamos la clave primaria de la tabla con la que estamos
enlazando

pablomonteserin.com

Claves forneas en hibernate

Hibernate reconoce una clave fornea en la base


de datos y crea en la Clase generada un mtodo
get para recuperar informacin de la tabla
vinculada.

pablomonteserin.com

Configuracin de consola
Btn derecho sobre el paquete -> run as -> Run configurations -> Hibernate
Console Configuration -> new configuration
Pestaa Main
Proyect: nombre del proyecto.
Configuration file: setup y busco el archivo hibernate.cfg.xml de
Configuracin.
Pestaa ClassPath:
Me aseguro de que estn cargadas las 9 libreras indicadas en la
diapositiva anterior.

pablomonteserin.com

Problema con el classpath


Si despus de crear la configuracin de consola aado nuevas librerias
al proyecto, estas no sern reconocidas por el classpath de
configuracin de consola, y al ejecutar la generacin automtica de
clases de hibernate obtendremos el siguiente error.

pablomonteserin.com

Problema al marcar los exporters

pablomonteserin.com

Hibernate Code Generation Configurations


Hay que estar en perspectiva Java.
Icono con desplegable de Hibernate -> Hibernate Code Generation Configurations
Pestaa Main:
Console configuration: Selecciono la configuracin de consola previamente
creada.
Output directory -> NombreDelProyecto/src.
Reverse engineer from JDBC Connection -> Marco la check
Package: com.pablomonteserin.model
Pestaa Exporters:
Marco las checks Domain code, Hibernate XML Mappings, Hibernate XML
Configuration.
Run
Esto crea una clase por cada tabla de mi base de datos, as como un get y set por cada
columna.

pablomonteserin.com

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

pablomonteserin.com

Ejercicio crear base de datos

pablomonteserin.com

De JDBC a Hibernate

Cambiamos la clase ConnectionProvider por SessionProvider. Por tanto, en vez


de obtener una conexin, obtenemos una sesin.

pablomonteserin.com

Hibernate API

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

pablomonteserin.com

Objeto Session Factory


Controla las sesiones. Hay que crearlo una vez sola en toda la
aplicacin.
Habr un sesin factory por cada base de datos.
Cada vez que necesito base de datos, se la pido a la sesin.

En una aplicacin web el sessionFactory estara el contexto, y lo declaro


una sola vez
para toda la aplicacin.
Sin embargo, el transaction y el session son declarados a nivel de
mtodo.
pablomonteserin.com

Recuperacin de la session para no tener que instanciar


un SessionFactory cada vez que la necesite.
public class ConexionProviderSingleton {
SessionFactory sessionFactory;
static private ConexionProviderSingleton _instance = null;
protected ConexionProviderSingleton() {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
public Session getSession(){
return sessionFactory.openSession();
}
static public ConexionProviderSingleton instance() {
if (null == _instance) {
_instance = new ConexionProviderSingleton();
}
return _instance;
}
}
Para recuperar la sesin desde la clase servicio:
Session session = ConexionProviderSingleton.instance().getSession();

pablomonteserin.com

Ejemplo

pablomonteserin.com

Transacciones
Cada request que llega del servidor debe ser atendido por una
sola transaccin.
En caso de fallo, lo que hay dentro del beginTransaction y el
commit no se ejecuta y se salta a un catch.
Siempre es ms rpido hacer dos operaciones en una sola
transaccin que dos operaciones en dos transacciones.
pablomonteserin.com

pablomonteserin.com

Mtodos de la clase Session


session.save() -> guarda un objeto como registro
en la base de datos.
session.update() -> modifica un objeto como
registro en la base de datos.
session.get(Persona.class, id) -> me permite recuperar
datos.
Session.delete(...) Mejor hacerlo con HQL.

pablomonteserin.com

session.get(Object.class, primary key)

pablomonteserin.com

Ejercicio
1 Insertar cuatro registros.
2 - Insertar cuatro registros en la base de datos e
imprimir los libros del autor cuya clave primaria es
Tres.
3 Modificar uno de los registros insertados.

pablomonteserin.com

Ejercicio
Insertar un autor de un libro y ese mismo libro

pablomonteserin.com

Mtodos de la clase Criteria


Consultar una tabla
Criteria crit = session.createCriteria(Autor.class);
List result = crit.list();
Consultar toda la base de datos
Criteria crit = session.createCriteria(java.lang.Object.class)
Ordenar el resultado de la consulta
crit.addOrder(Order.desc(''nombre''));
Aadir restricciones
Crit.add(Restrictions.ilike(''nombre'',''%ar%''));
Crit.add(Restrictions.eq(''nombre'', ''Juan''));
pablomonteserin.com

Ejercicio
Insertar 5 libros en la base de datos. Dos
registros deben tener el mismo ttulo (titulo1);
Utilizar la clase criteria para mostrar los libros
cuyo ttulo contenga la palabra ''titulo''.
Ordenar la salida por id, e ir recorriendala
imprimiendo los ttulos y las id con
System.out.println();

pablomonteserin.com

Consulta con Example

Creamos un objeto (s) y buscar a partir de l.


Si le pasamos null como parmetro el parmetro
es ignorado.

pablomonteserin.com

Trabajo con HQL

pablomonteserin.com

Eliminar un registro
String queryString = "delete from Paciente where id=?";
Query hqlQuery = session.createQuery(queryString);
hqlQuery.setInteger(0, id);
hqlQuery.executeUpdate();
Consulta simple
Query hqlQuery = session.createQuery(''from libro'');
List result = hqlQuery.list();
Consulta ordenada
Query hqlQuery = session.createQuery(''from libro order by id'');
List result = hqlQuery.list();
Consulta con parmetro
String queryString = from Libro where nombre like ?;
Query hqlQuery = session.createQuery(queryString).setString(0, %Ro%);
Consulta con parmetro II
String queryString =from Hombre where nombre like: textSearch;
Query hqlQuery = session.createQuery(queryString).setString(''textSearch'', %o%);
Consulta en el hbm
Consulta 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:
<query name="findLibroByTitulo">
<![CDATA[
from Libro l where l.titulo like :textoBusqueda
]]>
</query>
*/
Query hqlQuery = session.getNamedQuery("findLibroByTitulo").setParameter("textoBusqueda", "%a
%");
List result = hqlQuery.list();
pablomonteserin.com

Consulta relacionada
Aqu relaciono la tabla libro con la tabla autor

Consulta relacionada
String queryString = ''select l from libro l join l.autor a where a.nombre='nombre1' '';
Query hqlQuery = session.createQuery(queryString);
Consulta relacionada con coincidencia
String queryString = '' from Libro l where l.autor.nombre like :textSearch'';
Query hqlQuery = session.createQuery(queryString).setString(''textSearch'', ''%n%'');
Consulta sum
String queryString = ''select sum(l.id) from libro l '';
Query hqlQuery = session.createQuery(queryString);

pablomonteserin.com

Evitar inyeccin SQL


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

En cambio es aconsejable usar:

Parmetros con nombre:


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

pablomonteserin.com

Ejercicio

Relacin 1-n (1 vehculo puede tener varios


siniestros pero un siniestro slo puede tener un
vehculo)
No es un proyecto web

Realizar las siguientes consultas:


- Listar las matrculas de todos los vehculos.
- Listar la matrcula y el tipo de todos los vehculos ordenados por
nmero de ruedas.
- Listar la matrcula de todos los vehculos que tengan
ms de dos asientos y ms de dos ruedas.
- Listar la matrcula de todos los vehculos que tengan
ms de dos asientos o ms de dos ruedas.
- Listar la matriula de todos los vehculos que tengan una
matriula de menos de seis caracteres.
- Listar la matrcula de todos los vehculos que hayan
tenido un siniestro con valorPerdida mayor de 1000 euros.

pablomonteserin.com

También podría gustarte