Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Hibernate 3
Hibernate 3
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
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
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.
informacin confidencial
Labor tediosa
DAO
SQL
BD
ResultSet
informacin confidencial
Select * From Factura join Partida Select * From Factura -- Merge Select * From Partida Select * From Factura Fetch { Select * From 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
informacin confidencial
Domain Store
Clases de Negocio
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
informacin confidencial
JBoss JBoss
PostgreSQL 8.1
Plugins
DB Explorer
Deployment Services
MyEclipse MyEclipse Eclipse Eclipse Java Virtual Machine Java Virtual Machine
informacin confidencial
informacin confidencial
informacin confidencial
informacin confidencial
informacin confidencial
informacin confidencial
informacin confidencial
Tabla de Prueba
informacin confidencial
Nuevo Proyecto
informacin confidencial
informacin confidencial
Finalizando la configuracin
informacin confidencial
informacin confidencial
informacin confidencial
Agregando el Driver
informacin confidencial
Driver configurado
informacin confidencial
informacin confidencial
Finish
informacin confidencial
Abriendo la Conexin
informacin confidencial
Abrir Conexin
informacin confidencial
informacin confidencial
Configuracin de Hibernate
informacin confidencial
Creacin de la Configuracin
informacin confidencial
Creacin de un SessionFactory
informacin confidencial
Interfases Hibernate
Cfg (xml)
informacin confidencial
Elementos Creados
<<uses>>
SessionFactory currentSession()
<<uses>>
Hibernate.cfg.xml
Session
<<uses>>
Clase Aplicativa
Query
informacin confidencial
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
informacin confidencial
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
jdbc
BD
Transaction Manager
Hibernate Hibernate
Resource Manager
Datasource
BD
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
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
informacin confidencial
informacin confidencial
Por posicin
(from Cliente where nombre = ? and paterno = ?); La primera posicin es 0.
informacin confidencial
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
informacin confidencial
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
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();
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
informacin confidencial
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
informacin confidencial
Transaction Manager
Resource Manager
Datasource
BD
informacin confidencial
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
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
informacin confidencial
informacin confidencial
informacin confidencial
informacin confidencial
informacin confidencial
Verificando
informacin confidencial
Artifact Generation
informacin confidencial
informacin confidencial
informacin confidencial
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