SlideShare una empresa de Scribd logo
1 de 57
Descargar para leer sin conexión
Bases de Datos en JAVA
   Introducción a Hibernate




                 Carlos Hernando Carasol
                     chernando@acm.org
                      11 de Mayo de 2011
Í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
Motivación de ORM
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
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?
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
JPA
 Java Persistence API
 Def ne cómo persistir objetos
   i
 Proporciona un diseño que desacopla el
 modelo de la persistencia
EJB3
 Entorno JEE (Java Enterprise Edition)
 Def ne tres tipos:
   i
   Sesiones
   Mensajes
   Entidades   JPA
Hibernate
 Http://www.hibernate.org/
 Software libre
 Implementación de referencia de JPA
Introducción y configuración de Hibernate
Arquitectura de Hibernate
Arquitectura de Hibernate
Hibernate en pocas palablas
 SessionFactory
   Factoría de Session
 Session
   Envuelve JDBC Connection
   Factoría de Transaction
 Persistencia de objetos y colecciones
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
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 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
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
 Def ne la clase como una entidad
   i
 Es aconsejable que sea Serializable
 Es requisito que tenga un constructor
 vacío
Table
 Def ne la tabla dónde reside la entidad
   i
 Propiedades:
   name nombre de la tabla
Id
 Def ne el campo como clave
   i
 Subrrogate keys
 Suele ir acompañado de
 @GeneratedValue
Column
 Def ne el nombre de la columna
   i
 Añade restricciones
   nullable
   unique
   length
Añadir la entidad a Hibernate
 En la conf guración de hibernate, añadir
          i
 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 createQuery
 Utiliza una sintaxis similar a SQL
 Normalmente la utilizamos para devolver
 objetos
 Es ú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:
   Country
   City
 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 guardarlo
 Probar a guardarlo sin las transacciones
 Crear una ciudad nueva y guardarla
 Comprobar 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 nombre
 Ejecutar una query que busque por el
 nombre, no el identif cador
                     i
Eliminar datos
delete(o);
Ejercicio
 Eliminar el país que hemos creado antes
 Eliminar ciudades que empiecen por 'e'
Asociaciones
Relaciones OneToMany
 Las bases de datos son relacionales
 Queremos que nuestros objetos
 mantengan la relación cuando persistan
 Vamos 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 anotaciones
 fetch
  fetch=FetchType.EAGER
 cascade
  cascade=CascadeType.ALL
@JoinColumn
  No podemos utilizar @Column
  Utilizamos @JoinColumn
@JoinColumn(name="jugador_id")
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
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
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
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
Caso práctico
Diseño orientativo
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
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
Temas avanzados
Secuencias de modificación
int n = session
.createQuery(
"UPDATE Country set country = 'Zambia' WHERE
country = 'Carlos Landia'")
.executeUpdate();
Otras asociaciones
 @OneToOne
   En algunos casos se puede embeber
 @ManyToMany
   Es necesario crear una tabla intermedia
   @JoinTable
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
Herencia
 Divergencias entre clase y tabla
 En objetos es bastante común
 En 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 lectura
 Interceptores
 HQL
 Criteria
 Cache y optimización
 …
 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/

Más contenido relacionado

La actualidad más candente

PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
Darwin Durand
 
Tema 16 acceso a base de datos usando jpa por gio
Tema 16   acceso a base de datos usando jpa por gioTema 16   acceso a base de datos usando jpa por gio
Tema 16 acceso a base de datos usando jpa por gio
Robert Wolf
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
Robert Wolf
 
Bases de datos orientado a objetos
Bases de datos orientado a objetosBases de datos orientado a objetos
Bases de datos orientado a objetos
jorge220395
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
lmrv
 

La actualidad más candente (20)

Hibernate - JPA @luce 4
Hibernate - JPA @luce 4Hibernate - JPA @luce 4
Hibernate - JPA @luce 4
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - Serialización
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
Java Persistence Api (Jpa)
Java Persistence Api (Jpa)Java Persistence Api (Jpa)
Java Persistence Api (Jpa)
 
PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
 
jsf
jsfjsf
jsf
 
Spring community day 2010
Spring community day 2010Spring community day 2010
Spring community day 2010
 
Tema 16 acceso a base de datos usando jpa por gio
Tema 16   acceso a base de datos usando jpa por gioTema 16   acceso a base de datos usando jpa por gio
Tema 16 acceso a base de datos usando jpa por gio
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Introducción a ORMs
Introducción a ORMsIntroducción a ORMs
Introducción a ORMs
 
MAPEO OBJETO RELACIONAL
MAPEO OBJETO RELACIONAL MAPEO OBJETO RELACIONAL
MAPEO OBJETO RELACIONAL
 
S8-POO-4.2 BDD
S8-POO-4.2 BDDS8-POO-4.2 BDD
S8-POO-4.2 BDD
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetos
 
S8-BDD
S8-BDDS8-BDD
S8-BDD
 
Bases de datos orientado a objetos
Bases de datos orientado a objetosBases de datos orientado a objetos
Bases de datos orientado a objetos
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
 
05 jsp tags
05 jsp tags05 jsp tags
05 jsp tags
 
12-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net
12-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net12-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net
12-Unidad 2: Aplicaciones Windows Forms-2.3 Ado-net
 
Tipos de almacenamiento android básico sesion2
Tipos de almacenamiento android básico sesion2Tipos de almacenamiento android básico sesion2
Tipos de almacenamiento android básico sesion2
 

Destacado

Bases De Datos Mysql Con Java
Bases De Datos Mysql Con JavaBases De Datos Mysql Con Java
Bases De Datos Mysql Con Java
Yoni Villegas
 

Destacado (20)

Bases De Datos Mysql Con Java
Bases De Datos Mysql Con JavaBases De Datos Mysql Con Java
Bases De Datos Mysql Con Java
 
Bbdd en java
Bbdd en javaBbdd en java
Bbdd en java
 
Clase n°2 3-4 java
Clase n°2 3-4 javaClase n°2 3-4 java
Clase n°2 3-4 java
 
Clase No.2 Preparando el Ambiente de Java
Clase No.2 Preparando el Ambiente de Java Clase No.2 Preparando el Ambiente de Java
Clase No.2 Preparando el Ambiente de Java
 
Gestiondered 100222091702-phpapp01
Gestiondered 100222091702-phpapp01Gestiondered 100222091702-phpapp01
Gestiondered 100222091702-phpapp01
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Jdb ccompleto
Jdb ccompletoJdb ccompleto
Jdb ccompleto
 
Java con bd
Java con bdJava con bd
Java con bd
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
Presentacion camel
Presentacion camelPresentacion camel
Presentacion camel
 
Pasos para Instalar MySQL server
Pasos para Instalar MySQL server Pasos para Instalar MySQL server
Pasos para Instalar MySQL server
 
Conexión de Base de Datos
Conexión de Base de DatosConexión de Base de Datos
Conexión de Base de Datos
 
Design patterns
Design patternsDesign patterns
Design patterns
 
J2ee (java ee) design patterns and architecture
J2ee (java ee) design patterns and architectureJ2ee (java ee) design patterns and architecture
J2ee (java ee) design patterns and architecture
 
Apache Camel
Apache CamelApache Camel
Apache Camel
 
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-20063. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
 
Apache Camel - Parte II
Apache Camel - Parte IIApache Camel - Parte II
Apache Camel - Parte II
 
Calculadora Gráfica Java implementando el Patrón MVC
Calculadora Gráfica Java implementando el Patrón MVCCalculadora Gráfica Java implementando el Patrón MVC
Calculadora Gráfica Java implementando el Patrón MVC
 
Javantura v4 - Security architecture of the Java platform - Martin Toshev
Javantura v4 - Security architecture of the Java platform - Martin ToshevJavantura v4 - Security architecture of the Java platform - Martin Toshev
Javantura v4 - Security architecture of the Java platform - Martin Toshev
 
Crear conexion a servidor en MySQL Workbench
Crear conexion a servidor en  MySQL WorkbenchCrear conexion a servidor en  MySQL Workbench
Crear conexion a servidor en MySQL Workbench
 

Similar a Bases de Datos en Java - Intro a Hibernate

ADO NET Entity FrameWork
ADO NET Entity FrameWorkADO NET Entity FrameWork
ADO NET Entity FrameWork
mascodigo
 
visual basic .net
visual basic .netvisual basic .net
visual basic .net
vhaguilar
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
Robert Wolf
 
Active x data object ado.net
Active x data object ado.netActive x data object ado.net
Active x data object ado.net
Gissela Antohane
 
8. Acceso A Datos Con Microsoft Ado.Net
8.  Acceso A Datos Con Microsoft Ado.Net8.  Acceso A Datos Con Microsoft Ado.Net
8. Acceso A Datos Con Microsoft Ado.Net
guest3cf6ff
 

Similar a Bases de Datos en Java - Intro a Hibernate (20)

01 Ext Js Introduccion
01 Ext Js   Introduccion01 Ext Js   Introduccion
01 Ext Js Introduccion
 
P2C2 Introducción a JEE5
P2C2 Introducción a JEE5P2C2 Introducción a JEE5
P2C2 Introducción a JEE5
 
ADO NET Entity FrameWork
ADO NET Entity FrameWorkADO NET Entity FrameWork
ADO NET Entity FrameWork
 
visual basic .net
visual basic .netvisual basic .net
visual basic .net
 
Desarrollo de aplicaciones con wpf
Desarrollo de aplicaciones con wpfDesarrollo de aplicaciones con wpf
Desarrollo de aplicaciones con wpf
 
Taller de Grails
Taller de GrailsTaller de Grails
Taller de Grails
 
Guia7 java
Guia7 javaGuia7 java
Guia7 java
 
Objeto Connection
Objeto ConnectionObjeto Connection
Objeto Connection
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
 
Introducción a Java Persistence API
Introducción a Java Persistence APIIntroducción a Java Persistence API
Introducción a Java Persistence API
 
Ajax Huancayo
Ajax HuancayoAjax Huancayo
Ajax Huancayo
 
TUTORIAL DE ADO.NET MUY BUENO
TUTORIAL DE ADO.NET MUY BUENOTUTORIAL DE ADO.NET MUY BUENO
TUTORIAL DE ADO.NET MUY BUENO
 
Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)
 
Oo basico
Oo basicoOo basico
Oo basico
 
Active x data object ado.net
Active x data object ado.netActive x data object ado.net
Active x data object ado.net
 
Servletacceso bd
Servletacceso bdServletacceso bd
Servletacceso bd
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
8. Acceso A Datos Con Microsoft Ado.Net
8.  Acceso A Datos Con Microsoft Ado.Net8.  Acceso A Datos Con Microsoft Ado.Net
8. Acceso A Datos Con Microsoft Ado.Net
 
ADO .NET
ADO .NETADO .NET
ADO .NET
 

Más de Carlos Hernando (6)

Introduciendo Serverless en Proyectos Python
Introduciendo Serverless en Proyectos PythonIntroduciendo Serverless en Proyectos Python
Introduciendo Serverless en Proyectos Python
 
Microservicos: Cuándo y Cómo
Microservicos: Cuándo y CómoMicroservicos: Cuándo y Cómo
Microservicos: Cuándo y Cómo
 
Try AngularJS
Try AngularJSTry AngularJS
Try AngularJS
 
Django tricks (2)
Django tricks (2)Django tricks (2)
Django tricks (2)
 
Metodologías Ágiles
Metodologías ÁgilesMetodologías Ágiles
Metodologías Ágiles
 
Introducción rápida a SQL
Introducción rápida a SQLIntroducción rápida a SQL
Introducción rápida a SQL
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (12)

How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

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
  • 9. Hibernate Http://www.hibernate.org/ Software libre Implementación de referencia de 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
  • 15. 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>
  • 16. Configuración de depuración <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property>
  • 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
  • 20. Java Annotations Conocidos para documentación @Author Apuntes para el compilador @SuppressWarnings("unchecked") @Override Añaden funcionalidad
  • 21. 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() { }
  • 22. Entity Def ne la clase como una entidad i Es aconsejable que sea Serializable Es requisito que tenga un constructor vacío
  • 23. Table Def ne la tabla dónde reside la entidad i Propiedades: name nombre de la tabla
  • 24. Id Def ne el campo como clave i Subrrogate keys Suele ir acompañado de @GeneratedValue
  • 25. Column Def ne el nombre de la columna i Añade restricciones nullable unique length
  • 26. Añadir la entidad a Hibernate En la conf guración de hibernate, añadir i en mapping la clase.
  • 27. Ejercicio Crear las clases: Country – Id – country City – Id – city Establecer los @Table y @Column
  • 29. Consultar: createQuery Utilizamos createQuery Utiliza una sintaxis similar a SQL Normalmente la utilizamos para devolver objetos Es útil el método list()
  • 30. Ejemplo Query query = session.createQuery("SELECT j FROM Jugador j"); List<Jugador> result = query.list();
  • 31. Ejercicio Listar el contenido de: Country City con el formato: id: nombre
  • 32. Crear datos session.beginTransaction(); Jugador j = new Jugador(); j.setNombre(“Carlos”); session.save(j); session.getTransaction().close();
  • 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
  • 37. Ejercicio Eliminar el país que hemos creado antes Eliminar ciudades que empiecen por 'e'
  • 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/