Bases de Datos en Java - Intro a Hibernate

Post on 14-Dec-2014

8.473 views 2 download

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

Bases de Datos en JAVAIntroducción a Hibernate

Carlos Hernando Carasolchernando@acm.org11 de Mayo de 2011

Índice de contenidos

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

Motivación de ORM

Problemas con JDBC

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

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?

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

JPA

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

EJB3

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

SesionesMensajesEntidades � JPA

Hibernate

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

Introducción y configuración de Hibernate

Arquitectura de Hibernate

Arquitectura de Hibernate

Hibernate en pocas palablas

SessionFactoryFactoría de Session

SessionEnvuelve JDBC ConnectionFactoría de Transaction

Persistencia de objetos y colecciones

Añadir Hibernate al proyecto

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

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

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>

Configuración de depuración

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

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

Creando una conexión

// A SessionFactory is set up once for an application

sessionFactory = new Configuration()

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

.buildSessionFactory();

Ejercicio

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

Introducción a ORM

Java Annotations

Conocidos para documentación@Author

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

Añaden funcionalidad

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() {

}

Entity

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

Table

Defi ne la tabla dónde reside la entidadPropiedades:

name nombre de la tabla

Id

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

Column

Defi ne el nombre de la columnaAñade restricciones

nullableunique length

Añadir la entidad a Hibernate

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

Ejercicio

Crear las clases:Country– Id– country

City– Id– city

Establecer los @Table y @Column

Consultas y persistencia

Consultar: createQuery

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

Ejemplo

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

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

Ejercicio

Listar el contenido de:CountryCity

con el formato:id: nombre

Crear datos

session.beginTransaction();

Jugador j = new Jugador();

j.setNombre(“Carlos”);

session.save(j);

session.getTransaction().close();

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

Modificar datos

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

Es útil el método uniqueResult()

Ejercicio

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

Eliminar datos

delete(o);

Ejercicio

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

Asociaciones

Relaciones OneToMany

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

Ejemplo de OneToMany

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

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

Lado Many:@ManyToOne

private Country country;

Propiedades

Para ambas anotacionesfetch

fetch=FetchType.EAGER

cascade cascade=CascadeType.ALL

@JoinColumn

No podemos utilizar @ColumnUtilizamos @JoinColumn

@JoinColumn(name="jugador_id")

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

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

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

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

Caso práctico

Diseño orientativo

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

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

Temas avanzados

Secuencias de modificación

int n = session

.createQuery(

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

.executeUpdate();

Otras asociaciones

@OneToOneEn algunos casos se puede embeber

@ManyToManyEs necesario crear una tabla intermedia@JoinTable

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

Herencia

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

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)

Más cosas

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