View
8.473
Download
2
Category
Preview:
DESCRIPTION
Curso de introducción al uso de Hibernate para persistir objetos a bases de datos.
Citation preview
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/
Recommended