Bases de Datos en Java - Intro a Hibernate

57
Bases de Datos en JAVA Introducción a Hibernate Carlos Hernando Carasol [email protected] 11 de Mayo de 2011

description

Curso de introducción al uso de Hibernate para persistir objetos a bases de datos.

Transcript of Bases de Datos en Java - Intro a Hibernate

Page 1: Bases de Datos en Java - Intro a Hibernate

Bases de Datos en JAVAIntroducción a Hibernate

Carlos Hernando [email protected] de Mayo de 2011

Page 2: Bases de Datos en Java - Intro a Hibernate

Índice de contenidos

Motivación de ORMIntroducción y confi guración de HibernateIntroducción a ORMConsultas y persistenciaAsociacionesTemas avanzados

Page 3: Bases de Datos en Java - Intro a Hibernate

Motivación de ORM

Page 4: Bases de Datos en Java - Intro a Hibernate

Problemas con JDBC

Es muy artesanalNo hay una relación directa entre modelo y persistenciaComplica un diseño MVCEl mantenimiento es costoso

Page 5: Bases de Datos en Java - Intro a Hibernate

Acercando Objetos y Entidades

Las entidades son atributosLos objetos tienen atributos y métodosLas entidades tienen relacionesLos objetos son navegables

¿Cómo podemos tratarlos igual?

Page 6: Bases de Datos en Java - Intro a Hibernate

ORM

Object Relational Mapping“This creates, in effect, a "virtual object database" that can be used from within the programming language.” WikipediaLos objetos pueden persistir en base de datos de forma transparente para el programador

Page 7: Bases de Datos en Java - Intro a Hibernate

JPA

Java Persistence APIDefi ne cómo persistir objetosProporciona un diseño que desacopla el modelo de la persistencia

Page 8: Bases de Datos en Java - Intro a Hibernate

EJB3

Entorno JEE (Java Enterprise Edition)Defi ne tres tipos:

SesionesMensajesEntidades � JPA

Page 9: Bases de Datos en Java - Intro a Hibernate

Hibernate

Http://www.hibernate.org/Software libreImplementación de referencia de JPA

Page 10: Bases de Datos en Java - Intro a Hibernate

Introducción y configuración de Hibernate

Page 11: Bases de Datos en Java - Intro a Hibernate

Arquitectura de Hibernate

Page 12: Bases de Datos en Java - Intro a Hibernate

Arquitectura de Hibernate

Page 13: Bases de Datos en Java - Intro a Hibernate

Hibernate en pocas palablas

SessionFactoryFactoría de Session

SessionEnvuelve JDBC ConnectionFactoría de Transaction

Persistencia de objetos y colecciones

Page 14: Bases de Datos en Java - Intro a Hibernate

Añadir Hibernate al proyecto

Añadir las libreríasDriver JDBCHibernate*.jar y dependencias

Utilizar Hibernate Toolshttp://www.hibernate.org/subprojects/tools.html

Page 15: Bases de Datos en Java - Intro a Hibernate

Configuración hibernate.cfg.xml<?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 name="SFactory">

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql://localhost/sakila</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

</session-factory>

</hibernate-configuration>

Page 16: Bases de Datos en Java - Intro a Hibernate

Configuración de depuración

<property name="hibernate.show_sql">true</property>

<property name="hibernate.format_sql">true</property>

Page 17: Bases de Datos en Java - Intro a Hibernate

Creando una conexión

// A SessionFactory is set up once for an application

sessionFactory = new Configuration()

.configure() // configures settings from hibernate.cfg.xml

.buildSessionFactory();

Page 18: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Crear un proyectoAñadir las librerías necesariasIncluir las librerías en el Build PathCrear un hibernate.cfg.xml con ToolsCrear un SessionFactory

Page 19: Bases de Datos en Java - Intro a Hibernate

Introducción a ORM

Page 20: Bases de Datos en Java - Intro a Hibernate

Java Annotations

Conocidos para documentación@Author

Apuntes para el compilador@SuppressWarnings("unchecked")@Override

Añaden funcionalidad

Page 21: Bases de Datos en Java - Intro a Hibernate

Creando una entidad

@Entity

@Table(name = "country")

public class Country implements java.io.Serializable {

@Id

@GeneratedValue

@Column(name = "country_id", unique = true, nullable = false)

private Short countryId

@Column(name = "country", nullable = false, length = 50)

private String country;

public Country() {

}

Page 22: Bases de Datos en Java - Intro a Hibernate

Entity

Defi ne la clase como una entidadEs aconsejable que sea SerializableEs requisito que tenga un constructor vacío

Page 23: Bases de Datos en Java - Intro a Hibernate

Table

Defi ne la tabla dónde reside la entidadPropiedades:

name nombre de la tabla

Page 24: Bases de Datos en Java - Intro a Hibernate

Id

Defi ne el campo como claveSubrrogate keysSuele ir acompañado de @GeneratedValue

Page 25: Bases de Datos en Java - Intro a Hibernate

Column

Defi ne el nombre de la columnaAñade restricciones

nullableunique length

Page 26: Bases de Datos en Java - Intro a Hibernate

Añadir la entidad a Hibernate

En la confi guración de hibernate, añadir en mapping la clase.

Page 27: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Crear las clases:Country– Id– country

City– Id– city

Establecer los @Table y @Column

Page 28: Bases de Datos en Java - Intro a Hibernate

Consultas y persistencia

Page 29: Bases de Datos en Java - Intro a Hibernate

Consultar: createQuery

Utilizamos createQueryUtiliza una sintaxis similar a SQLNormalmente la utilizamos para devolver objetosEs útil el método list()

Page 30: Bases de Datos en Java - Intro a Hibernate

Ejemplo

Query query = session.createQuery("SELECT j FROM Jugador j");

List<Jugador> result = query.list();

Page 31: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Listar el contenido de:CountryCity

con el formato:id: nombre

Page 32: Bases de Datos en Java - Intro a Hibernate

Crear datos

session.beginTransaction();

Jugador j = new Jugador();

j.setNombre(“Carlos”);

session.save(j);

session.getTransaction().close();

Page 33: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Crear un país nuevo y guardarloProbar a guardarlo sin las transaccionesCrear una ciudad nueva y guardarlaComprobar el estado de la base de datos

Page 34: Bases de Datos en Java - Intro a Hibernate

Modificar datos

Con el objeto que nos interese:session.update(o);

Es útil el método uniqueResult()

Page 35: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Elegir un país y cambiarle el nombreEjecutar una query que busque por el nombre, no el identifi cador

Page 36: Bases de Datos en Java - Intro a Hibernate

Eliminar datos

delete(o);

Page 37: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Eliminar el país que hemos creado antesEliminar ciudades que empiecen por 'e'

Page 38: Bases de Datos en Java - Intro a Hibernate

Asociaciones

Page 39: Bases de Datos en Java - Intro a Hibernate

Relaciones OneToMany

Las bases de datos son relacionalesQueremos que nuestros objetos mantengan la relación cuando persistanVamos a verlo bilateralmente

Page 40: Bases de Datos en Java - Intro a Hibernate

Ejemplo de OneToMany

Lado One:@OneToMany(mappedBy="jugador")

private List<Titulo> titulos = new ArrayList<Titulo>();

Lado Many:@ManyToOne

private Country country;

Page 41: Bases de Datos en Java - Intro a Hibernate

Propiedades

Para ambas anotacionesfetch

fetch=FetchType.EAGER

cascade cascade=CascadeType.ALL

Page 42: Bases de Datos en Java - Intro a Hibernate

@JoinColumn

No podemos utilizar @ColumnUtilizamos @JoinColumn

@JoinColumn(name="jugador_id")

Page 43: Bases de Datos en Java - Intro a Hibernate

Ejercicio: consultas y relaciones

Establecer la relación entre City y CountryActivar la depuración de SQLEscenario 1:

Sin fi jar el fetch (LAZY) listar de al menos dos países sus ciudades

Escenario 2:Fijando el fetch a EAGER listar de al menos dos países sus ciudades

Page 44: Bases de Datos en Java - Intro a Hibernate

Ejercicio: establecer relaciones

Escenario 1:Crear un país y guardarCrear una ciudad y asignarle el país creado y guardarloEste escenario no debería daros problemas

Page 45: Bases de Datos en Java - Intro a Hibernate

Ejercicio: establecer relaciones

Escenario 2:Crear un paísCrear una ciudad y fi jar el país anteriorGuardar ciudadEste escenario provoca un fallo al intentar relacionar un país que no está guardadoEs necesario utilizar cascade

Page 46: Bases de Datos en Java - Intro a Hibernate

Ejercicio: establecer relaciones

Escenario 3Crear un paísCrear una ciudadAñadir la ciudad a la lista de ciudades del paísGuardar paísEste escenario provoca el mismo error que antesEs necesario fi jar el país en la ciudad

Page 47: Bases de Datos en Java - Intro a Hibernate

Caso práctico

Page 48: Bases de Datos en Java - Intro a Hibernate

Diseño orientativo

Page 49: Bases de Datos en Java - Intro a Hibernate

Ejercicio

Utilizar el código del otro caso como basePlantear un buen diseñoProporcionar para las entidades:

ListadoCreación y actualización de registrosEliminar un registro

Listado de las vistas (o consultas directas)Un ejemplo como si se llamara desde UI

Page 50: Bases de Datos en Java - Intro a Hibernate

Ejercicio cont.

Procedimiento TareaNotifi cada, que elimine la notifi cación y muestre por pantalla la información de la tareaCrear un OrganizarTareas(persona) que asigne las tareas un día detrás de otroCrear 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

Page 51: Bases de Datos en Java - Intro a Hibernate

Temas avanzados

Page 52: Bases de Datos en Java - Intro a Hibernate

Secuencias de modificación

int n = session

.createQuery(

"UPDATE Country set country = 'Zambia' WHERE country = 'Carlos Landia'")

.executeUpdate();

Page 53: Bases de Datos en Java - Intro a Hibernate

Otras asociaciones

@OneToOneEn algunos casos se puede embeber

@ManyToManyEs necesario crear una tabla intermedia@JoinTable

Page 54: Bases de Datos en Java - Intro a Hibernate

Generación de SQL

Utilizamos hbm2ddlSe puede programar

Confi guration cfg = new Confi guration().confi gure(); SchemaExport schemaExport = new SchemaExport(cfg); schemaExport.create(false, true);

Se puede añadir a la confi guraciónhibernate.hbm2ddl.auto=create

Page 55: Bases de Datos en Java - Intro a Hibernate

Herencia

Divergencias entre clase y tablaEn objetos es bastante comúnEn tablas no :)Hibernate permite herencias

Page 56: Bases de Datos en Java - Intro a Hibernate

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)

Page 57: Bases de Datos en Java - Intro a Hibernate

Más cosas

Entidades solo lecturaInterceptoresHQLCriteriaCache y optimización… http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/