Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Bases de Datos en Java - Intro a Hibernate
1. Bases de Datos en JAVA
Introducción a Hibernate
Carlos Hernando Carasol
chernando@acm.org
11 de Mayo de 2011
2. Índice de contenidos
Motivación de ORM
Introducción y conf guración de Hibernate
i
Introducción a ORM
Consultas y persistencia
Asociaciones
Temas avanzados
4. Problemas con JDBC
Es muy artesanal
No hay una relación directa entre modelo
y persistencia
Complica un diseño MVC
El mantenimiento es costoso
5. Acercando Objetos y Entidades
Las entidades son atributos
Los objetos tienen atributos y métodos
Las entidades tienen relaciones
Los objetos son navegables
¿Cómo podemos tratarlos igual?
6. ORM
Object Relational Mapping
“This creates, in effect, a "virtual object
database" that can be used from within
the programming language.” Wikipedia
Los objetos pueden persistir en base de
datos de forma transparente para el
programador
7. JPA
Java Persistence API
Def ne cómo persistir objetos
i
Proporciona un diseño que desacopla el
modelo de la persistencia
8. EJB3
Entorno JEE (Java Enterprise Edition)
Def ne tres tipos:
i
Sesiones
Mensajes
Entidades JPA
13. Hibernate en pocas palablas
SessionFactory
Factoría de Session
Session
Envuelve JDBC Connection
Factoría de Transaction
Persistencia de objetos y colecciones
14. Añadir Hibernate al proyecto
Añadir las librerías
Driver JDBC
Hibernate*.jar y dependencias
Utilizar Hibernate Tools
http://www.hibernate.org/subprojects/tools.html
17. Creando una conexión
// A SessionFactory is set up once for an
application
sessionFactory = new Configuration()
.configure() // configures settings from
hibernate.cfg.xml
.buildSessionFactory();
18. Ejercicio
Crear un proyecto
Añadir las librerías necesarias
Incluir las librerías en el Build Path
Crear un hibernate.cfg.xml con Tools
Crear un SessionFactory
29. Consultar: createQuery
Utilizamos createQuery
Utiliza una sintaxis similar a SQL
Normalmente la utilizamos para devolver
objetos
Es útil el método list()
33. Ejercicio
Crear un país nuevo y guardarlo
Probar a guardarlo sin las transacciones
Crear una ciudad nueva y guardarla
Comprobar el estado de la base de datos
34. Modificar datos
Con el objeto que nos interese:
session.update(o);
Es útil el método uniqueResult()
35. Ejercicio
Elegir un país y cambiarle el nombre
Ejecutar una query que busque por el
nombre, no el identif cador
i
39. Relaciones OneToMany
Las bases de datos son relacionales
Queremos que nuestros objetos
mantengan la relación cuando persistan
Vamos a verlo bilateralmente
40. Ejemplo de OneToMany
Lado One:
@OneToMany(mappedBy="jugador")
private List<Titulo> titulos = new
ArrayList<Titulo>();
Lado Many:
@ManyToOne
private Country country;
41. Propiedades
Para ambas anotaciones
fetch
fetch=FetchType.EAGER
cascade
cascade=CascadeType.ALL
42. @JoinColumn
No podemos utilizar @Column
Utilizamos @JoinColumn
@JoinColumn(name="jugador_id")
43. Ejercicio: consultas y relaciones
Establecer la relación entre City y Country
Activar la depuración de SQL
Escenario 1:
Sin i jar el fetch (LAZY) listar de al menos
f
dos países sus ciudades
Escenario 2:
Fijando el fetch a EAGER listar de al menos
dos países sus ciudades
44. Ejercicio: establecer relaciones
Escenario 1:
Crear un país y guardar
Crear una ciudad y asignarle el país creado y
guardarlo
Este escenario no debería daros problemas
45. Ejercicio: establecer relaciones
Escenario 2:
Crear un país
Crear una ciudad y f jar el país anterior
i
Guardar ciudad
Este escenario provoca un fallo al intentar
relacionar un país que no está guardado
Es necesario utilizar cascade
46. Ejercicio: establecer relaciones
Escenario 3
Crear un país
Crear una ciudad
Añadir la ciudad a la lista de ciudades del
país
Guardar país
Este escenario provoca el mismo error que
antes
Es necesario f jar el país en la ciudad
i
49. Ejercicio
Utilizar el código del otro caso como base
Plantear un buen diseño
Proporcionar para las entidades:
Listado
Creación y actualización de registros
Eliminar un registro
Listado de las vistas (o consultas directas)
Un ejemplo como si se llamara desde UI
50. Ejercicio cont.
Procedimiento TareaNotif cada, que
i
elimine la notif cación y muestre por
i
pantalla la información de la tarea
Crear un OrganizarTareas(persona) que
asigne las tareas un día detrás de otro
Crear un ReasignarTarea(tarea, persona)
que intente asignar la tarea a esa persona
y falle en caso de que esa persona ya
tenga algo el mismo día
52. Secuencias de modificación
int n = session
.createQuery(
"UPDATE Country set country = 'Zambia' WHERE
country = 'Carlos Landia'")
.executeUpdate();
53. Otras asociaciones
@OneToOne
En algunos casos se puede embeber
@ManyToMany
Es necesario crear una tabla intermedia
@JoinTable
54. Generación de SQL
Utilizamos hbm2ddl
Se puede programar
Conf guration cfg = new
i
Conf guration().conf gure();
i i
SchemaExport schemaExport = new
SchemaExport(cfg);
schemaExport.create(false, true);
Se puede añadir a la conf guración
i
hibernate.hbm2ddl.auto=create
55. Herencia
Divergencias entre clase y tabla
En objetos es bastante común
En tablas no :)
Hibernate permite herencias
56. Estrategias de herencia
Una tabla por entidad
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
Una tabla por familia de clases
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name = "BILLING_DETAILS_TYPE", discriminatorType =
DiscriminatorType.STRING)
@DiscriminatorValue(“CCC”)
Una tabla por subclase
@Inheritance(strategy = InheritanceType.JOINED)
57. Más cosas
Entidades solo lectura
Interceptores
HQL
Criteria
Cache y optimización
…
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/