Está en la página 1de 116

Hibernate 3

Ramiro Gonzlez Snchez Octubre del 2006

Contenido Sesin 1
El problema del mapeo Objeto/Relacional Patrones de Diseo involucrados QuickStart

Sesin 2
O/R Mapping Consultas Persistencia

Sesin 3
Transacciones Hibernate Tools Evaluacin

informacin confidencial

El problema del mapeo Objeto/Relacional

UML

E/R

Un Modelo de Clases responde necesidades de modelado que no necesariamente satisfacen las reglas de normalizacin o integridad de un Modelo de EntidadRelacin.

Factura

Partida

Nada impide que una Partida aparezca en 2 Facturas.

Factura

Partida

informacin confidencial

UML

E/R

Adicionalmente, un Modelo de Clases posee mecanismos que no tienen una contraparte en E/R como: Herencia, Interfases y Relaciones bidireccionales, Multiplicidad muchos a muchos.

Factura Electrnica Factura Factura Impresa

informacin confidencial

Labor tediosa

ValueObject ValueObject ValueObject


get()

DAO

SQL

BD
ResultSet

Proceso Iterativo: { get get get }

informacin confidencial

Problema n + 1 Los joins de tablas no tienen un mapeo natural.

Partida Factura Partida Partida


Partida Factura Partida Partida Factura Partida Partida Partida Partida Factura Partida Partida

Select * From Factura join Partida Select * From Factura -- Merge Select * From Partida Select * From Factura Fetch { Select * From Partida }

Partida Factura Partida Partida

informacin confidencial

Otros problemas Caching de Objetos: Problema de igualdad. Objetos compartidos Objetos bloqueados Transacciones sobre objetos

informacin confidencial

El mundo ideal
Factura f = new Factura(); f.add(new Partida()); domainStore.save(f); //insert into Factura; insert into Partida //commit // f = query.find(Factura, 12345); // select * from Factura where id = 12345; // select * from Partida where id = 12345; f.removePartida(1); // delete from Partida where domainStore.save(f);

informacin confidencial

Patrones de Diseo involucrados

Data Access Object

informacin confidencial

Domain Store

Clases de Negocio

Administrador Administrador De De Persistencia Persistencia

Mapeo

BD

informacin confidencial

QuickStart

Ambiente utilizado para el Curso Windows XP Professional Edition Service Pack 2 J2SE Development Kit v. 1.5.0_04 Eclipse SDK 3.1.2 MyEclipse IDE v. 4.1.1 GA JBoss 4.0.3 SP1 PostgreSQL v. 8.1
MyEclipse 4.1.1 GA MyEclipse 4.1.1 GA Eclipse SDK 3.1.2 Eclipse SDK 3.1.2 J2SE Development Kit 1.5.0_06 J2SE Development Kit 1.5.0_06 Windows XP Professional Edition SP2 Windows XP Professional Edition SP2
informacin confidencial

Descargar ftp://ssdesa01 usuario: curso Password: curso

informacin confidencial

Estructura del Ambiente de Desarrollo

JBoss JBoss
PostgreSQL 8.1

Java Virtual Machine Java Virtual Machine

Plugins

DB Explorer

Deployment Services

MyEclipse MyEclipse Eclipse Eclipse Java Virtual Machine Java Virtual Machine
informacin confidencial

Verificacin de Ambiente JDK


Variable de entorno JAVA_HOME vlida %JAVA_HOME%\bin en el PATH Ejecutar en lnea de comandos java -version

informacin confidencial

Verificacin de Ambiente MyEclipse


Verificar que existe el men y qu arranca con la correcta versin.

informacin confidencial

Verificacin de Ambiente JBoss


Localizar la carpeta donde est instalado (usualmente C:\Java\jboss-4.0.3SP1) A esta carpeta le llamaremos de ahora en adelante JBOSS_HOME Posicionarse en lnea de comandos en: %JBOSS_HOME%\bin Y ejecutar el comando: run.bat

informacin confidencial

Verificando el Ambiente PostgreSQL

informacin confidencial

Arrancar la Base de Datos

informacin confidencial

Crear Base de Datos

informacin confidencial

Tabla de Prueba

informacin confidencial

Nuevo Proyecto

informacin confidencial

Configuracin del Proyecto Java

informacin confidencial

Finalizando la configuracin

informacin confidencial

Configuracin de una conexin

informacin confidencial

Edicin del driver

informacin confidencial

Agregando el Driver

informacin confidencial

Driver configurado

informacin confidencial

Configuracin de un Profile de Conexin

informacin confidencial

Finish

informacin confidencial

Abriendo la Conexin

informacin confidencial

Abrir Conexin

informacin confidencial

Habilitando Hibernate en nuestro proyecto

informacin confidencial

Configuracin de Hibernate

informacin confidencial

Creacin de la Configuracin

informacin confidencial

Creacin de un SessionFactory

informacin confidencial

Interfases Hibernate

Session Aplicacin Java Transaction Query Hibernate Hibernate jdbc BD

Cfg (xml)

informacin confidencial

Elementos Creados

<<uses>>

SessionFactory currentSession()

<<uses>>

Hibernate.cfg.xml

Mappings.hbm.xml Mappings.hbm.xml Mappings.hbm.xml

Session

<<uses>>

Clases Clases Clases Persistentes Persistentes Clases Persistentes Persistentes

Clase Aplicativa

Query

informacin confidencial

Configuracin de la Conexin en Hibernate

informacin confidencial

Conexin en Hibernate

informacin confidencial

Mapping de 1 tabla

informacin confidencial

ID Generator

informacin confidencial

Mapping insertado
<?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"> <!-- Generated by MyEclipse Hibernate Tools. <hibernate-configuration> <session-factory> <property name="myeclipse.connection.profile">qshibernate</property> <property name="connection.url">jdbc:postgresql://localhost:5432/testHibernate</property> <property name="connection.username">postgres</property> <property name="connection.password">notiene</property> <property name="connection.driver_class">org.postgresql.Driver</property> <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> <mapping resource="mx/com/ids/qshibernate/Mensajes.hbm.xml" /> -->

</session-factory> </hibernate-configuration>

informacin confidencial

Cdigo Generado

informacin confidencial

Log4J Hibernate utiliza Log4J para enviar sus mensajes de Log. Por lo que se requiere adicionalmente insertar la configuracin de Log4j en el classpath: log4j.logger.org.hibernate.ce=info log4j.logger.org.hibernate=info ### log HQL query parser activity #log4j.logger.org.hibernate.hql.ast.AST=debug ### log just the SQL log4j.logger.org.hibernate.SQL=info ### log JDBC bind parameters ### #log4j.logger.org.hibernate.type=debug
informacin confidencial

Obtencin de la Conexin
public static Session currentSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null) { if (sessionFactory == null) { try { cfg.configure(CONFIG_FILE_LOCATION); sessionFactory = cfg.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } session = sessionFactory.openSession(); threadLocal.set(session); } return session; }

informacin confidencial

Prueba
public static void main(String[] args) { // Step 1 - Create a new entity Mensajes message = new Mensajes(); // Step 2 - Set message field message.setTexto("Hello Hibernate, from MyEclipse!"); try { // Step 3 - Get a Hibernate Session Session session = HSessionFactory.currentSession(); // Step 4 - Persist entity to database Transaction tx = session.beginTransaction(); session.save(message); tx.commit(); System.out.println("Save successful."); } catch (HibernateException e) { System.out.println("Save failed."); } finally { try { // Step 5 - close the session HSessionFactory.closeSession(); } catch (HibernateException e1) { // do nothing } } }

informacin confidencial

2005-11-10 22:40:49,390 [main] INFO org.hibernate.impl.SessionFactoryImpl Checking 0 named queries 2005-11-10 22:40:49,468 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 42P01 2005-11-10 22:40:49,468 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: relation "hibernate_sequence" does not exist Save failed.

informacin confidencial

Especificando el nombre de la secuencia


<id name="id" column="id" type="java.lang.Integer"> <generator class="native"> <param name="sequence"> mensajes_id_seq </param> </generator> </id> 2005-11-10 22:51:05,328 [main] INFO org.hibernate.impl.SessionFactoryImpl Checking 0 named queries Save successful.

informacin confidencial

Resultado en la base de datos

informacin confidencial

Prueba 2
public static void main(String[] args) { try { // Step 1 - Get a Hibernate Session Session session = HSessionFactory.currentSession(); // Step 2 - Crea un query Query q = session.createQuery("from Mensajes"); String qSQL = q.getQueryString(); System.out.println("Query: " + qSQL); // Step 3 - Ejecuta el query List l = q.list(); for (Iterator iter = l.iterator(); iter.hasNext();) { Mensajes element = (Mensajes) iter.next(); System.out.println(element.getId() + ":" + element.getTexto()); } } catch (HibernateException e) {

informacin confidencial

Prueba 3
public static void main(String[] args) { try { // Step 1 - Get a Hibernate Session Session session = HSessionFactory.currentSession(); // Step 2 - Crea un query con parametro Query q = session.createQuery("from Mensajes where id = :pId"); // Step 3 - Indica el parametro q.setInteger("pId", 1); // Step 4 - Ejecuta el query List l = q.list(); String qSQL = q.getQueryString(); System.out.println("Query: " + qSQL); for (Iterator iter = l.iterator(); iter.hasNext();) { Mensajes element = (Mensajes) iter.next(); System.out.println(element.getId() + ":" + element.getTexto()); } } catch (HibernateException e) {

informacin confidencial

O/R Mapping

Modos de Operacin Administrado y No Administrado

Session Aplicacin Java Transaction Query Hibernate Hibernate


Connection Pool

jdbc

BD

Session Aplicacin Java Transaction Query


informacin confidencial

Transaction Manager

Hibernate Hibernate
Resource Manager
Datasource

BD

Propiedades tiles en hibernate.cfg.xml show_sql = true hibernate.default_schema = ESQUEMAX

informacin confidencial

Modelo de Pruebas

Producto

Factura

Partida

Cliente

informacin confidencial

Escritura de POJOs
Deben
Implementar Serializable Implementar un constructor vaco

informacin confidencial

Escritura de POJOs
Declarar los mtodos set y get de cada propiedad/columna excepto la llave primaria.

informacin confidencial

Escritura de POJOs
El tipo de la llave primaria puede ser una clase auxiliar para manejar el caso de llave compuesta.

informacin confidencial

Escritura de POJOs
Los campos que representan llaves forneas deben ser declarados con el tipo de la Clase que representa la entidad fornea.

informacin confidencial

Asociaciones Bidireccionales
De la Factura al Cliente se puede navegar con la declaracin de la columna Cliente en Factura. La operacin inversa requiere de declarar un Set de facturas en el cliente. /** The value of the facturaSet one-to-many association. */ private java.util.Set facturaSet; public java.util.Set getFacturaSet() { return this.facturaSet; } public void setFacturaSet(java.util.Set facturaSet) { this.facturaSet = facturaSet; }
informacin confidencial

Cliente.hbm.xml
DTD

Paquete

Clase

PK Asociacin
informacin confidencial

Factura.hbm.xml

FK

informacin confidencial

Partida.hbm.xml

Llave Compuesta

Llave fornea dentro de Llave Compuesta


informacin confidencial

Opciones de IDs native


identity sequence

assigned

informacin confidencial

Consultas

get() int clienteId=1; Cliente cliente = (Cliente) session.get(Cliente.class, new Long(clienteId); Si el clienteId solicitado no existe, get() regresa null.

informacin confidencial

Navegando por el Grafo Una vez cargado un objeto es posible obtener el resto... siempre y cuando la sesin siga abierta. Cliente cliente = partida.getFactura().getCliente();

informacin confidencial

Mediante HQL Query query = session.createQuery (from Cliente c where c.email like %ids.com.mx ); List l = query.list(); Esto es idntico a: List l = session.find(from Cliente c where u.email like %ids.com.mx );

informacin confidencial

Utilizando SQL Nativo Query query = session.createQuery( Select mx.com.ids.qshibernate.Cliente(*) from Cliente where id = :pId); List l = query.list();

informacin confidencial

Query by Criteria Criteria criteria = session.createCriteria(Cliente.class); criteria.add( Expression.like(email, %ids.com.mx); criteria.addOrder(Order.asc(paterno); List l = criteria.list();

informacin confidencial

Query by Example Cliente clienteX = new Cliente(); clientex.setNombre(Juan); Criteria criteria = session.createCriteria(Cliente.class); criteria.add( Example.create(clienteX) ); List l = criteria.list();

informacin confidencial

Paginacin Utilizando un objeto Query o Criteria query.setFirstResult(41); query.setMaxResults(20);

informacin confidencial

Leyendo 1 solo rengln query.setMaxResult(1); query.uniqueResult();

informacin confidencial

Manejo de parmetros Por nombre


(from Cliente where id = :pId);

Por posicin
(from Cliente where nombre = ? and paterno = ?); La primera posicin es 0.

informacin confidencial

Estrategias de Fetching Immediate Fetching


Inmediato (1 por 1)

Lazy Fetching
En el primer acceso (por default)

Eager Fetching
El objeto y sus relaciones

Batch Fetching
Lectura en lotes (merge)

informacin confidencial

Estrategia de Acceso Se puede declarar en el mapeo o durante tiempo de ejecucin. En el mapeo se maneja por Asociacin y se tienen 3 parmetros:
lazy = true o false outer-join = true o false batch-size = 9

En una clase solo puede haber una asociacin con outerjoin=true

informacin confidencial

Profundidad del Fetch Se debe controlar la profundidad de los joins:


hibernate.max_fetch_depth=1,2,3

Utilizar mximo a 4.

informacin confidencial

Eager Fetching Por default, se usa lazy loading Para provocar el eager fetching en tiempo de ejecucin se describe la intencin en el query: from Factura f left join fetch f.partidaSet

informacin confidencial

Theta-join Se utiliza en tablas que no tienen una asociacin definida from User user, LogRecord log where user.username = log.username Esto devuelve pares de los objetos referenciados: while( i.hasNext() ) { Object[] pair = (Object []) i.next(); User user = (User) pair[0]; LogRecord log = (LogRecord) pair[1]; }

informacin confidencial

Report Queries Tabular select item.id, item.description order by item.id retorna Object[]; Mediante Objeto predefinido select new Renglon( item.id, item.description ) order by item.id Renglon, debe ser una clase con el constructor apropiado.

informacin confidencial

Named Queries En el mapping de la tabla principal: <sql-query name=findClientesFacturas> <![CDATA[ select {c.*}, {f.*} from cliente c inner join factura f where c.id = f.idcliente ]]> <return alias=c class=Cliente /> <return alias=f class=Factura /> </sql-query> Nota: Tambin funciona para HQL con la etiqueta query.

informacin confidencial

Persistencia

Ciclo de Vida de un Objeto

informacin confidencial

Creando un objeto persistente Cliente cliente = new Cliente(); cliente.setNombre(Juan); cliente.setPaterno(Perez); cliente.setEmail(x@xxx.org); Session session = QSSessionFactory.currentSession(); Transaction tx = session.beginTransaction(); session.save(cliente); tx.commit(); session.close();

informacin confidencial

Actualizacin de Detached con Update cliente.setMaterno(Perez); Session session = QSSessionFactory.currentSession(); Transaction tx = session.beginTransaction(); session.update(cliente); cliente.setEmail(xyz@xxx.org); tx.commit(); session.close();

Cualquier objeto asociado a la base de datos, se actualiza automticamente.


informacin confidencial

Actualizacin con Lock cliente.setMaterno(Perez); Session session = QSSessionFactory.currentSession(); Transaction tx = session.beginTransaction(); session.lock(cliente, LockMode.NONE); cliente.setEmail(xyz@xxx.org); tx.commit(); session.close();

READ UPGRADE

informacin confidencial

Borrado de un Objeto session.delete(objeto)

informacin confidencial

Ejercicio Instale el ambiente de desarrollo


JDK PostgreSQL Eclipse MyEclipse

Cree una base de datos con PGAdminIII Corra el script creaTestHibernate.sql Genere el proyecto configurado para Hibernate Genere los mappings de las tablas recin creadas Escriba cdigo que
Inserte 2 clientes nuevos Inserte 2 productos nuevos Inserte 1 factura a cada cliente con su respectiva partida y referenciando a 1 producto Liste los clientes con sus facturas con sus partidas con sus productos
informacin confidencial

Transacciones

Manejo de Transacciones La estructura de cdigo estndar y recomendada es la siguiente:

informacin confidencial

Transacciones dentro del Contenedor J2EE

Session Aplicacin Java Transaction Query Hibernate Hibernate

Transaction Manager

Resource Manager

Datasource

BD

hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory hibernate.transaction.manager_lookup_class = <dependiente del Application Server>

informacin confidencial

JTA Transaction Manager

org.hibernate.transaction.JBossTransactionManagerLookup org.hibernate.transaction.WeblogicTransactionManagerLookup org.hibernate.transaction.WebSphereTransactionManagerLookup org.hibernate.transaction.WebSphereExtendedJTATransactionLookup org.hibernate.transaction.OrionTransactionManagerLookup org.hibernate.transaction.ResinTransactionManagerLookup org.hibernate.transaction.JOTMTransactionManagerLookup org.hibernate.transaction.JOnASTransactionManagerLookup org.hibernate.transaction.JRun4TransactionManagerLookup org.hibernate.transaction.BESTransactionManagerLookup

JBoss Weblogic WebSphere WebSphere 6 Orion/OC4J/OracleAS Resin JOTM JOnAS JRun4 Borland ES

informacin confidencial

Hibernate Tools

Conversin entre Modelos

UML (XMI) UML (XMI) AndroMDA POJOs POJOs Xdoclet O/R Mapping O/R Mapping hbm2ddl DDL DDL Middlegen hbm2java Reverse Engineering

informacin confidencial

Instalacin de Hibernate Tools Simplemente se desempaca el paquete que contiene los Hiberneta Tools en el directorio de Eclipse.

informacin confidencial

Nuevo proyecto Java

informacin confidencial

Configuracin Proyecto Java

informacin confidencial

Nuevo Java Package

informacin confidencial

Nuevo Hibernate Configuration File

informacin confidencial

Create Hibernate Console Configuration

informacin confidencial

Verificando

informacin confidencial

Artifact Generation

informacin confidencial

Configuracin de Artifact Generation

informacin confidencial

Setup Reverse Engineering

informacin confidencial

Seleccin de carpeta y nombre

informacin confidencial

Include Exclude

informacin confidencial

Configuracin final

informacin confidencial

Confirmacin

informacin confidencial

Artefactos Generados

informacin confidencial

HQL Editor

informacin confidencial

Modelo Relacional

informacin confidencial

Preguntas

informacin confidencial

Referencias Hibernate in Action Christian Bauer, Gaving King Manning (disponible en pdf) www.hibernate.org Downloads, documentacin de referencia. http://caveatemptor.hibernate.org Aplicacin demo de hibernate Sun J2EE Patterns Catalog http://java.sun.com/blueprints/patterns/catalog.html

informacin confidencial

También podría gustarte