Está en la página 1de 152

Subdirección General de Sistemas y Telecomunicaciones

Desarrollo de una capa de acceso a datos


con Hibernate.

Aplicacion Imperium.

Arquitectura Endesa.

15/01/2007
Breve introducion a Hibernate
mail@endesa.es
www.endesa.es

1
Contenidos.

Capitulos.
1. Introducion a Hibernate.
2. Imperium. Ejemplo de Hibernate.
3. Consulta de Datos.
3.1. HQL.
3.2. QBE,QBC,SQL.
4. Otra forma.
Sistemas y Telecomunicaciones < Nombre del Documento >
2 < Fecha del Documento >

2
Introducion a Hibernate.Persistencia de datos.

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB
JDO

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB
JDO
Problemas con la persistencia.

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB
JDO
Problemas con la persistencia.
clave primaria, clave foraneas, tablas

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB
JDO
Problemas con la persistencia.
clave primaria, clave foraneas, tablas
Herencia , polimorfismo.

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB
JDO
Problemas con la persistencia.
clave primaria, clave foraneas, tablas
Herencia , polimorfismo.
Identidad

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Introducion a Hibernate.Persistencia de datos.

Falta de una solucion óptima. 1º lenguaje oo.


JDBC
EJB
JDO
Problemas con la persistencia.
clave primaria, clave foraneas, tablas
Herencia , polimorfismo.
Identidad
Impedance Mismatch.

Sistemas y Telecomunicaciones < Nombre del Documento >


3 < Fecha del Documento >

3
Hibernate.

ORM .

Sistemas y Telecomunicaciones < Nombre del Documento >


4 < Fecha del Documento >

4
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.
Mantenibilidad. El codigo es mas facil de adaptar y mantener y escribir.

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.
Mantenibilidad. El codigo es mas facil de adaptar y mantener y escribir.
Rendimiento. Es Middleware, mejor optimización.gc.

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.
Mantenibilidad. El codigo es mas facil de adaptar y mantener y escribir.
Rendimiento. Es Middleware, mejor optimización.gc.
Independencia. Hibernate se encarga de las particularidades de la base
de datos.

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.
Mantenibilidad. El codigo es mas facil de adaptar y mantener y escribir.
Rendimiento. Es Middleware, mejor optimización.gc.
Independencia. Hibernate se encarga de las particularidades de la base
de datos.
Claridad. El codigo en mucho más facil de ententer.

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.
Mantenibilidad. El codigo es mas facil de adaptar y mantener y escribir.
Rendimiento. Es Middleware, mejor optimización.gc.
Independencia. Hibernate se encarga de las particularidades de la base
de datos.
Claridad. El codigo en mucho más facil de ententer.
Seguridad. Herramientas probadas y contranstadas en infinidad de
situaciones y entornos.

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate como herramienta ORM.

Definicion:

“Un ORM ( Object Relational Mapping) es un sistema que nos permite almacenar
Objetos de nuestra aplicación java en tablas de una base de datos relacional de
manera transparente , usando metadatos que describen la relación entre nuestros
objetos y la base de datos”

Productividad. Nos centramos en el problema del negocio. No perdemos


tiempo con jdbc, sql, excepciones.
Mantenibilidad. El codigo es mas facil de adaptar y mantener y escribir.
Rendimiento. Es Middleware, mejor optimización.gc.
Independencia. Hibernate se encarga de las particularidades de la base
de datos.
Claridad. El codigo en mucho más facil de ententer.
Seguridad. Herramientas probadas y contranstadas en infinidad de
situaciones y entornos.
Pruebas. Es muy facil escribir test(junit , testng, o hechos en casa)

Sistemas y Telecomunicaciones < Nombre del Documento >


5 < Fecha del Documento >

5
Hibernate.Creador.

Gaving King

Sistemas y Telecomunicaciones < Nombre del Documento >


6 < Fecha del Documento >

6
Por qué Hibernate.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Codigo Abierto. Con todas las ventajas que eso aporta, más
seguro , mas estable, independencia del vendedor.kry.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Codigo Abierto. Con todas las ventajas que eso aporta, más
seguro , mas estable, independencia del vendedor.kry.

Excelente documentado.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Codigo Abierto. Con todas las ventajas que eso aporta, más
seguro , mas estable, independencia del vendedor.kry.

Excelente documentado.

Desarrollo activo.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Codigo Abierto. Con todas las ventajas que eso aporta, más
seguro , mas estable, independencia del vendedor.kry.

Excelente documentado.

Desarrollo activo.

Maravillosas herramientas. Tareas de ant.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Codigo Abierto. Con todas las ventajas que eso aporta, más
seguro , mas estable, independencia del vendedor.kry.

Excelente documentado.

Desarrollo activo.

Maravillosas herramientas. Tareas de ant.

Estandar de facto.

Sistemas y Telecomunicaciones < Nombre del Documento >


7 < Fecha del Documento >

7
Por qué Hibernate.

Funciona. Motor de persistencia de JBoss.

Codigo Abierto. Con todas las ventajas que eso aporta, más
seguro , mas estable, independencia del vendedor.kry.

Excelente documentado.

Desarrollo activo.

Maravillosas herramientas. Tareas de ant.

Estandar de facto.

JPA. Hibernate es un desarrollo de esta especificación, pero aporta

más cosas.
Sistemas y Telecomunicaciones < Nombre del Documento >
7 < Fecha del Documento >

7
Mitos y Leyendas sobre hibernate.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Genera mucho SQL.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Genera mucho SQL.

Caja Negra.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Genera mucho SQL.

Caja Negra.

No es estandar.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Genera mucho SQL.

Caja Negra.

No es estandar.

Te atas a un servidor de aplicaciones.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Genera mucho SQL.

Caja Negra.

No es estandar.

Te atas a un servidor de aplicaciones.

Te atas a un provedor.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Mitos y Leyendas sobre hibernate.

Rendimiento.

Genera mucho SQL.

Caja Negra. O S
LS
FA
S
No es estandar.
O
D
TO
Te atas a un servidor de aplicaciones.

Te atas a un provedor.

Sistemas y Telecomunicaciones < Nombre del Documento >


8 < Fecha del Documento >

8
Hibernate.

Imperium .

Sistemas y Telecomunicaciones < Nombre del Documento >


9 < Fecha del Documento >

9
Aplicacion de Ejemplo. Imperium.

Sistemas y Telecomunicaciones < Nombre del Documento >


10 < Fecha del Documento >

10
Hibernate. Imperium.

Modelo .

Sistemas y Telecomunicaciones < Nombre del Documento >


11 < Fecha del Documento >

11
Relacion Uml entre Familias , Patricios y Legionarios .

1 N 1 1

Sistemas y Telecomunicaciones < Nombre del Documento >


12 < Fecha del Documento >

12
Clase Patricios
Los métodos get y set se
han suprimido por claridad.

Están, pero para


package com.endesa.ame4j.imperium.modelo;
Hibernate no son
import java.io.Serializable;
necesarios.
public class Patricios implements Serializable{

private Long id ;
private String nombre;
private Integer edad;

public Patricios(final String Nombre, final Integer edad) {


this.edad = edad;
this.nombre = nombre;
}

public Patricios() {
}
}
13

Sistemas y Telecomunicaciones < Nombre del Documento >


< Fecha del Documento >

13
Relacion uml entre Legionarios y Legiones

N
0

N 1

Sistemas y Telecomunicaciones < Nombre del Documento >


14 < Fecha del Documento >

14
Clase Legiones

package com.endesa.ame4j.imperium.modelo;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Legiones implements Serializable{


private Long id ;
private String nombre;
private Patricios general;
private Set<Legionarios> legionarios = new HashSet<Legionarios>
}

Sistemas y Telecomunicaciones < Nombre del Documento >


15 < Fecha del Documento >

15
Clase Legionarios.

package com.endesa.ame4j.imperium.modelo;

import java.io.Serializable;

public class Legionarios {

private Long id;


private String nombre;
private Legiones legion;
private Legionarios jefe;

public Legionarios(String nombre,Legiones legion) {


this.nombre = nombre;
this.legion = legion;
}

public Legionarios() {
}
}

Sistemas y Telecomunicaciones < Nombre del Documento >


16 < Fecha del Documento >

16
Relacion uml entre Legiones y Batallas.

N N

Sistemas y Telecomunicaciones < Nombre del Documento >


17 < Fecha del Documento >

17
Clase Batallas.

package com.endesa.ame4j.imperium.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

public class Batallas implements Serializable {

private Long id ;
private String nombre;
private String lugar ;
private Date fecha;
private Boolean victoria;
private Set legiones;

public Batallas(String nombre, String lugar,


final String Boolean, final Date fecha) {
}

public Batallas() {
}

Sistemas y Telecomunicaciones < Nombre del Documento >


18 < Fecha del Documento >

18
uml modelo .

N
0

1 N N N

1 N

Sistemas y Telecomunicaciones < Nombre del Documento >


19 < Fecha del Documento >

19
Hibernate. Imperium.

Ficheros
xml .

Sistemas y Telecomunicaciones < Nombre del Documento >


20 < Fecha del Documento >

20
Configuracion Hibernate. Relacion Clase Patricios.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo"
default-access="field">
<class name="Patricios">

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


21 < Fecha del Documento >

21
Configuracion Hibernate. Relacion Clase Patricios.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo"
default-access="field">
<class name="Patricios">
<id name="id" type="long" >
<column name="ID_PATRICIOS" />
<generator class="native"/>
</id>

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


21 < Fecha del Documento >

21
Configuracion Hibernate. Relacion Clase Patricios.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo"
default-access="field">
<class name="Patricios">
<id name="id" type="long" >
<column name="ID_PATRICIOS" />
<generator class="native"/>
</id>

<property name="nombre" type="string" length="50"/>


<property name="edad" type="integer" />

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


21 < Fecha del Documento >

21
Configuracion Hibernate. Ralacion Clase Legiones.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-
mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Legiones">
<id name="id" type="long">
<column name="ID_LEGIONES" />
<generator class="native"/>
</id>
<property name="nombre" length="50"/>

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


22 < Fecha del Documento >

22
Configuracion Hibernate. Ralacion Clase Legiones.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-
mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Legiones">
<id name="id" type="long">
<column name="ID_LEGIONES" />
<generator class="native"/>
</id>
<property name="nombre" length="50"/>
<many-to-one name="general" class="Patricios" column="FK_ID_PATRICIOS" unique="true"/>

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


22 < Fecha del Documento >

22
Configuracion Hibernate. Ralacion Clase Legiones.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-
mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Legiones">
<id name="id" type="long">
<column name="ID_LEGIONES" />
<generator class="native"/>
</id>
<property name="nombre" length="50"/>
<many-to-one name="general" class="Patricios" column="FK_ID_PATRICIOS" unique="true"/>
<set name="legionarios" cascade="all,delete-orphan" inverse="true">
<key column="FK_ID_LEGIONES"/>
<one-to-many class="Legionarios" />
</set>
</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


22 < Fecha del Documento >

22
Configuracion Hibernate. Relacion Clase Legionarios.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Legionarios">

<id name="id" type="long" >


<column name="ID_LEGIONARIOS" />
<generator class="native"/>
</id>
<property name="nombre" />

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


23 < Fecha del Documento >

23
Configuracion Hibernate. Relacion Clase Legionarios.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Legionarios">

<id name="id" type="long" >


<column name="ID_LEGIONARIOS" />
<generator class="native"/>
</id>
<property name="nombre" />

<many-to-one name="legion" class="Legiones" >


<column name="FK_ID_LEGIONES" not-null="true" />
</many-to-one>

</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


23 < Fecha del Documento >

23
Configuracion Hibernate. Relacion Clase Legionarios.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Legionarios">

<id name="id" type="long" >


<column name="ID_LEGIONARIOS" />
<generator class="native"/>
</id>
<property name="nombre" />

<many-to-one name="legion" class="Legiones" >


<column name="FK_ID_LEGIONES" not-null="true" />
</many-to-one>

<many-to-one name="jefe" class="Legionarios">


<column name="FK_ID_JEFE"/>
</many-to-one>
</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


23 < Fecha del Documento >

23
Configuracion Hibernate. Relacion Clase Batallas.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">
<class name="Batallas">

<id name="id" type="long" >


<column name="ID_BATALLAS" />
<generator class="native"/>
</id>

<property name="nombre"/>
<property name="lugar"/>
<property name="fecha" type="timestamp" />
<property name="victoria" type="boolean" />

<set name="legiones" table="BATALLAS_LEGIONES">


<key not-null="true" column="ID_BATALLAS" />
<many-to-many class="Legiones" column="ID_LEGIONES" />
</set>
</class>
</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


24 < Fecha del Documento >

24
Hibernate. Imperium.

Spring .

Sistemas y Telecomunicaciones < Nombre del Documento >


25 < Fecha del Documento >

25
Configuracion Hibernate. Fichero de Spring.

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns='http://www.springframework.org/schema/beans'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation='http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-eans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd'>

</beans>

<bean id="fuenteDatos" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">


<property name="driverClassName"><value>org.apache.derby.jdbc.ClientDriver</value></property>
<property name="url"><value>jdbc:derby://127.0.0.1:1527/legiones</value></property>
<property name="username"><value>admin</value></property>
<property name="password"><value>admin</value></property>
</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


26 < Fecha del Documento >

26
Configuración Hibernate. Fichero de Spring.

<bean id="creador" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


27 < Fecha del Documento >

27
Configuración Hibernate. Fichero de Spring.

<bean id="creador" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="mappingResources">
<list>
<value>com/endesa/ame4j/imperium/modelo/Patricios.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Legiones.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Legionarios.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Batallas.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Familias.hbm.xml<value>
</list>
</property>

</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


27 < Fecha del Documento >

27
Configuración Hibernate. Fichero de Spring.

<bean id="creador" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="mappingResources">
<list>
<value>com/endesa/ame4j/imperium/modelo/Patricios.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Legiones.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Legionarios.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Batallas.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Familias.hbm.xml<value>
</list>
</property>

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.max_fetch_depth">0</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.use_sql_comments">false</prop>
</props>
</property>

</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


27 < Fecha del Documento >

27
Configuración Hibernate. Fichero de Spring.

<bean id="creador" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="mappingResources">
<list>
<value>com/endesa/ame4j/imperium/modelo/Patricios.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Legiones.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Legionarios.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Batallas.hbm.xml</value>
<value>com/endesa/ame4j/imperium/modelo/Familias.hbm.xml<value>
</list>
</property>

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.max_fetch_depth">0</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.use_sql_comments">false</prop>
</props>
</property>

<property name="dataSource"><ref local="fuenteDatos"/></property>

</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


27 < Fecha del Documento >

27
Configuracion Hibernate. Fichero de Spring.

Sistemas y Telecomunicaciones < Nombre del Documento >


28 < Fecha del Documento >

28
Configuracion Hibernate. Fichero de Spring.

<bean id="transaccion" class="org.springframework.orm.hibernate3.HibernateTransactionManager">


<property name="sessionFactory" ref="creador"/>
</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


28 < Fecha del Documento >

28
Configuracion Hibernate. Fichero de Spring.

<bean id="transaccion" class="org.springframework.orm.hibernate3.HibernateTransactionManager">


<property name="sessionFactory" ref="creador"/>
</bean>

<tx:advice id="consejo" transaction-manager="transaccion">


<tx:attributes>
<tx:method name="insertar" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="modificar" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="borrar" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="buscar*" propagation="SUPPORTS" isolation="DEFAULT" read-only="true"/>
<tx:method name="reclutar*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="licenciar*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="metodos"
expression="execution(* com.endesa.ame4j.imperium.dao.Dao*.* (..))"/>
<aop:advisor advice-ref="consejo" pointcut-ref="metodos"/>
</aop:config>
No ha
ce
aplica r en
ciones

Sistemas y Telecomunicaciones < Nombre del Documento >


28 < Fecha del Documento >

28
Configuracion Hibernate. Fichero de Spring.

<bean id="transaccion" class="org.springframework.orm.hibernate3.HibernateTransactionManager">


<property name="sessionFactory" ref="creador"/>
</bean>

<tx:advice id="consejo" transaction-manager="transaccion">


<tx:attributes>
<tx:method name="insertar" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="modificar" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="borrar" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="buscar*" propagation="SUPPORTS" isolation="DEFAULT" read-only="true"/>
<tx:method name="reclutar*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="licenciar*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="metodos"
expression="execution(* com.endesa.ame4j.imperium.dao.Dao*.* (..))"/>
<aop:advisor advice-ref="consejo" pointcut-ref="metodos"/>
</aop:config>
No ha
ce
aplica r en
<bean id="dao" class="com.endesa.ame4j.imperium.dao.DaoGeneral" >
<property name="sessionFactory" ref="creador"/> ciones
</bean>
<bean id="daoLegiones" class="com.endesa.ame4j.imperium.dao.DaoLegiones" >
<property name="sessionFactory" ref="creador"/>
</bean>

Sistemas y Telecomunicaciones < Nombre del Documento >


28 < Fecha del Documento >

28
Contrato Capa Acceso a Datos.

Sistemas y Telecomunicaciones < Nombre del Documento >


29 < Fecha del Documento >

29
Contrato Capa Acceso a Datos.

package com.endesa.ame4j.imperium.dao;
public interface Persistir {
public void insertar(Object objeto);
public Object buscarPorId(Class clase , Long id);
public void borrar(Object objeto);
public void modificar(Object objeto);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


29 < Fecha del Documento >

29
Contrato Capa Acceso a Datos.

package com.endesa.ame4j.imperium.dao;
public interface Persistir {
public void insertar(Object objeto);
public Object buscarPorId(Class clase , Long id);
public void borrar(Object objeto);
public void modificar(Object objeto);
}

package com.endesa.ame4j.imperium.dao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class DaoGeneral extends HibernateDaoSupport implements Persistir {
public void insertar(Object objeto){
getSession().save(objeto);
}
public Object buscarPorId(Class clase, Long id) {
return getSession().get(clase, id);
}
public void borrar(Object objeto) {
getSession().delete(objeto);
}
public void modificar(Object objeto) {
Session sesion = getSession();
sesion.update(objeto);
}
}

Sistemas y Telecomunicaciones < Nombre del Documento >


29 < Fecha del Documento >

29
ESQUEMA DE BASE DE DATOS CREADO POR HIBERNATE EN DERBY

Sistemas y Telecomunicaciones < Nombre del Documento >


30 < Fecha del Documento >

30
ESQUEMA DE BASE DE DATOS CREADO POR HIBERNATE EN HSQL

Sistemas y Telecomunicaciones < Nombre del Documento >


31 < Fecha del Documento >

31
Test sobre los datos.

Insercion

Borrado

Encontrar por clave primaria

No encontrar por clave primaria

Modificar

Sistemas y Telecomunicaciones < Nombre del Documento >


32 < Fecha del Documento >

32
Test de insercion.

Patricios
public void testInsertar(){
Patricios patricios = new Patricios("Romius Maximus",25);
dao.insertar(patricios);
assertNotNull(patricios.getId());
}

Batallas
public void testInsertar(){
Batallas batallas = new Batallas("Cannae","Llanura de Cannae",false,new Date());
dao.insertar(batallas);
assertNotNull(batallas.getId());
}

Legiones
public void testInsertar(){
Legiones legiones = new Legiones("DecimoNovena Celta");
dao.insertar(legiones);
assertNotNull(legiones.getId());
}

Legionarios
public void testInsertar(){
long indice = -1 ;
Legiones legiones = new Legiones(); legiones.setId(indice);
Legionarios legionarios = new Legionarios("Plinius Antonius",legiones);
dao.insertar(legionarios); assertNotNull(legionarios.getId()); }

Sistemas y Telecomunicaciones < Nombre del Documento >


33 < Fecha del Documento >

33
Test de Borrado.

Patricios
public void testBorrar(){

Patricios patricios = new Patricios();


dao.insertar(patricios);
assertNotNull(patricios.getId());

Patricios patriciosBbdd=
(Patricios)dao.buscarPorId(Patricios.class,patricios.getId());
assertEquals(patricios.getId(), patriciosBbdd.getId());

dao.borrar(patricios);
Patricios patriciosFantasmas=
(Patricios)dao.buscarPorId(Patricios.class,patricios.getId());

assertNull(patriciosFantasmas);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


34 < Fecha del Documento >

34
Test encontrar por clave primaria.

public void testBuscarPorId(){ Patricios


long indice = -1;
Patricios patricios = (Patricios)dao.buscarPorId(Patricios.class, indice);
assertTrue(patricios.getId() == indice);
}

public void testBuscarPorId(){ Batallas


long indice = -1;
Batallas batallas = (Batallas)dao.buscarPorId(Batallas.class, indice);
assertTrue(batallas.getId() == -indice);
}

public void testBuscarPorId(){ Legiones


long indice = -1;
Legiones legiones = (Legiones)dao.buscarPorId(Legiones.class, indice);
assertTrue(legiones.getId() == indice);
}

public void testBuscarPorId(){ Legionarios


long indice = -1;
Legionarios legionarios = (Legionarios)dao.buscarPorId(Legionarios.class, indice);
assertTrue(legionarios.getId() == indice);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


35 < Fecha del Documento >

35
Test no encontrar por clave primaria.

public void testNoEncontrarPorId(){ Patricios


long indice = -1;
Patricios patricios = (Patricios)dao.buscarPorId(Patricios.class, indice);
assertNull(patricios);
}

public void testNoEncontrarPorId(){


Batallas
long indice = -1;
Batallas batallas = (Batallas)dao.buscarPorId(Batallas.class, indice);
assertNull(batallas);

Legiones
public void testNoEncontrarPorId(){
long indice = -1;
Legiones legiones = (Legiones)dao.buscarPorId(Legiones.class, indice);
assertNull(legiones);
}

Legionarios
public void testNoEncontrarPorId(){
long indice = -1;
Legionarios legionarios = (Legionarios)dao.buscarPorId(Legionarios.class, indice);
assertNull(legionarios);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


36 < Fecha del Documento >

36
Test Modificar.

Sistemas y Telecomunicaciones < Nombre del Documento >


37 < Fecha del Documento >

37
Test Modificar.

public void testModificar(){ Legiones


long indice = -1;
Legiones legiones = (Legiones)dao.buscarPorId(Legiones.class, indice);

String nombreAnt = legiones.getNombre();


String nombre = "Mc"+ nombreAnt;
legiones.setNombre(nombre);

dao.modificar(legiones);
Legiones legionesModificada = (Legiones)dao.buscarPorId(Legiones.class, indice);
assertEquals(nombre, legionesModificada.getNombre());
}

Sistemas y Telecomunicaciones < Nombre del Documento >


37 < Fecha del Documento >

37
Test Modificar.

public void testModificar(){ Legiones


long indice = -1;
Legiones legiones = (Legiones)dao.buscarPorId(Legiones.class, indice);

String nombreAnt = legiones.getNombre();


String nombre = "Mc"+ nombreAnt;
legiones.setNombre(nombre);

dao.modificar(legiones);
Legiones legionesModificada = (Legiones)dao.buscarPorId(Legiones.class, indice);
assertEquals(nombre, legionesModificada.getNombre());
}

public void testModificarSinUpdate(){


Legiones
Object dao = ac.getBean("daoLegiones");
long indice = -1;
String nombre = "Segunda Numida";
((Modificar)dao).modificar(indice,nombre);
Persistir daoGeneral = (Persistir)dao;
Legiones legionesModificada = (Legiones)daoGeneral.buscarPorId(Legiones.class, indice);
assertEquals(nombre, legionesModificada.getNombre());
}

Sistemas y Telecomunicaciones < Nombre del Documento >


37 < Fecha del Documento >

37
Test Modificar.

Interfaz
package com.endesa.ame4j.imperium.dao;

public interface Modificar {

public void modificar(Long id, String nombre );


}

Desarrollo de la Interfaz
package com.endesa.ame4j.imperium.dao;

public class DaoLegiones extends DaoGeneral implements Reclutamiento,Modificar {


[....]
public void modificar(Long id, String nombre) {
Legiones legiones = (Legiones)getSession().get(Legiones.class, id);
legiones.setNombre(nombre);
}
[...]
}

Sistemas y Telecomunicaciones < Nombre del Documento >


38 < Fecha del Documento >

38
Reclutamiento.

package com.endesa.ame4j.imperium.dao;
Interfaz
import java.util.Collection;
import com.endesa.ame4j.imperium.modelo.Legionarios;
import com.endesa.ame4j.imperium.modelo.Legiones;

public interface Reclutamiento extends Persistir {


public void reclutarLegionarios(Long legion, Collection<Legionarios> legionarios);
public void reclutarLegion(Legiones legiones);
public void licenciarLegionarios(Long legion,Collection<Legionarios> legionarios);
public void licenciarLegion(Long legion);
public void licenciarTodosLegionarios(Long legion);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


39 < Fecha del Documento >

39
Reclutamiento.

Sistemas y Telecomunicaciones < Nombre del Documento >


40 < Fecha del Documento >

40
Reclutamiento.

package com.endesa.ame4j.imperium.dao;
Desarrollo de Interfaz Reclutamiento
import java.util.Collection;
import com.endesa.ame4j.imperium.modelo.Legionarios;
import com.endesa.ame4j.imperium.modelo.Legiones;

public class DaoLegiones extends DaoGeneral implements Reclutamiento,Modificar {

Sistemas y Telecomunicaciones < Nombre del Documento >


40 < Fecha del Documento >

40
Reclutamiento.

package com.endesa.ame4j.imperium.dao;
Desarrollo de Interfaz Reclutamiento
import java.util.Collection;
import com.endesa.ame4j.imperium.modelo.Legionarios;
import com.endesa.ame4j.imperium.modelo.Legiones;

public class DaoLegiones extends DaoGeneral implements Reclutamiento,Modificar {

public void reclutarLegionarios(Long legion, Collection<Legionarios> legionarios){


Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);
legiones.addLegionarios(legionarios);

Sistemas y Telecomunicaciones < Nombre del Documento >


40 < Fecha del Documento >

40
Reclutamiento.

package com.endesa.ame4j.imperium.dao;
Desarrollo de Interfaz Reclutamiento
import java.util.Collection;
import com.endesa.ame4j.imperium.modelo.Legionarios;
import com.endesa.ame4j.imperium.modelo.Legiones;

public class DaoLegiones extends DaoGeneral implements Reclutamiento,Modificar {

public void reclutarLegionarios(Long legion, Collection<Legionarios> legionarios){


Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);
legiones.addLegionarios(legionarios);

public void reclutarLegion(Legiones legiones) {


getSession().save(legiones);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


40 < Fecha del Documento >

40
Reclutamiento.

package com.endesa.ame4j.imperium.dao;
Desarrollo de Interfaz Reclutamiento
import java.util.Collection;
import com.endesa.ame4j.imperium.modelo.Legionarios;
import com.endesa.ame4j.imperium.modelo.Legiones;

public class DaoLegiones extends DaoGeneral implements Reclutamiento,Modificar {

public void reclutarLegionarios(Long legion, Collection<Legionarios> legionarios){


Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);
legiones.addLegionarios(legionarios);

public void reclutarLegion(Legiones legiones) {


getSession().save(legiones);
}

public void licenciarLegionarios(Long legion, Collection<Legionarios> legionarios) {


Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);
legiones.delLegionarios(legionarios);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


40 < Fecha del Documento >

40
Reclutamiento.Desarrollo de la interfaz.

Sistemas y Telecomunicaciones < Nombre del Documento >


41 < Fecha del Documento >

41
Reclutamiento.Desarrollo de la interfaz.

public void licenciarLegion(Long legion) {


Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);
getSession().delete(legiones);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


41 < Fecha del Documento >

41
Reclutamiento.Desarrollo de la interfaz.

public void licenciarLegion(Long legion) {


Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);
getSession().delete(legiones);
}

public void licenciarTodosLegionarios(Long legion) {

Legiones legiones = (Legiones)getSession().get(Legiones.class, legion);


legiones.delLegionarios();
}

Sistemas y Telecomunicaciones < Nombre del Documento >


41 < Fecha del Documento >

41
Hibernate.

Destrucción del mito. .

Sistemas y Telecomunicaciones < Nombre del Documento >


42 < Fecha del Documento >

42
Mitos y Leyendas. Genera Mucho SQL

public void testEncontrarPorId(){


long indice = -1;
Legiones legiones = (Legiones)dao.buscarPorId(Legiones.class, indice);
assertTrue(legiones.getId() == indice);
}

Sistemas y Telecomunicaciones < Nombre del Documento >


43 < Fecha del Documento >

43
Hibernate para consultas a Base de Datos.

Capitulo 3. Consultas a Base de Datos.

Sistemas y Telecomunicaciones < Nombre del Documento >


44 < Fecha del Documento >

44
Hibernate para consultas a Base de Datos.

Capitulo 3. Consultas a Base de Datos.

HQL
Hibernate Query Lenguague

Sistemas y Telecomunicaciones < Nombre del Documento >


44 < Fecha del Documento >

44
Hibernate para consultas a Base de Datos. HQL.

Sistemas y Telecomunicaciones < Nombre del Documento >


45 < Fecha del Documento >

45
Hibernate para consultas a Base de Datos. HQL.

•Portabilidad. No con SQL..Funciones con distinto


¿Por qué otro lenguaje? nombre.
•Independencia del motor de base de datos
•Programo en Java, no es SQL. Pero debo saber SQL.

Sistemas y Telecomunicaciones < Nombre del Documento >


45 < Fecha del Documento >

45
Hibernate para consultas a Base de Datos. HQL.

•Portabilidad. No con SQL..Funciones con distinto


¿Por qué otro lenguaje? nombre.
•Independencia del motor de base de datos
•Programo en Java, no es SQL. Pero debo saber SQL.

•Optimizado para navegar por los objetos.


¿Que me aporta? •Vision Orientada a objetos de nuestras consultas.
Ya no tengo que pensar en dos modos.
• Puedo hacer consultas por jerarquias de objetos.
• reconfiguracion de las consultas.
• Dialectos. h2,derby,hsql,oracle,db2,firebird,....

Sistemas y Telecomunicaciones < Nombre del Documento >


45 < Fecha del Documento >

45
Hibernate para consultas a Base de Datos. HQL.

•Portabilidad. No con SQL..Funciones con distinto


¿Por qué otro lenguaje? nombre.
•Independencia del motor de base de datos
•Programo en Java, no es SQL. Pero debo saber SQL.

•Optimizado para navegar por los objetos.


¿Que me aporta? •Vision Orientada a objetos de nuestras consultas.
Ya no tengo que pensar en dos modos.
• Puedo hacer consultas por jerarquias de objetos.
• reconfiguracion de las consultas.
• Dialectos. h2,derby,hsql,oracle,db2,firebird,....

•Nada de sql. Funciones, agrupacion, subSelect,


¿Que pierdo? parametros, uniones, like, between,ordenacion.
•Solo las modificaciones especificas de cada motor.

Sistemas y Telecomunicaciones < Nombre del Documento >


45 < Fecha del Documento >

45
Hibernate para consultas a Base de Datos. HQL.

•Portabilidad. No con SQL..Funciones con distinto


¿Por qué otro lenguaje? nombre.
•Independencia del motor de base de datos
•Programo en Java, no es SQL. Pero debo saber SQL.

•Optimizado para navegar por los objetos.


¿Que me aporta? •Vision Orientada a objetos de nuestras consultas.
Ya no tengo que pensar en dos modos.
• Puedo hacer consultas por jerarquias de objetos.
• reconfiguracion de las consultas.
• Dialectos. h2,derby,hsql,oracle,db2,firebird,....

•Nada de sql. Funciones, agrupacion, subSelect,


¿Que pierdo? parametros, uniones, like, between,ordenacion.
•Solo las modificaciones especificas de cada motor.

No. Es muy parecido al SQL, pero con objetos en lugar


¿Es dificil de aprender ? de tablas.

Sistemas y Telecomunicaciones < Nombre del Documento >


45 < Fecha del Documento >

45
Ejemplos de HQL. Ejemplo 1.

¿Todas las batallas en las que haya participado el Consul Quinto Varro ?

SQL

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


46 < Fecha del Documento >

46
Ejemplos de HQL. Ejemplo 1.

¿Todas las batallas en las que haya participado el Consul Quinto Varro ?

select distinct b.nombre, b.victoria,p.nombre


from Batallas b, Batallas_legiones bl, Legiones l, Patricios p
where b.id_batallas = bl.id_batallas SQL
and bl.id_legiones = l.id_legiones
and p.id_patricios = l.fk_id_patricios
and p.nombre = 'Quinto Varro'

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


46 < Fecha del Documento >

46
Ejemplos de HQL. Ejemplo 1.

¿Todas las batallas en las que haya participado el Consul Quinto Varro ?

select distinct b.nombre, b.victoria,p.nombre


from Batallas b, Batallas_legiones bl, Legiones l, Patricios p
where b.id_batallas = bl.id_batallas SQL
and bl.id_legiones = l.id_legiones
and p.id_patricios = l.fk_id_patricios
and p.nombre = 'Quinto Varro'

select distinct b HQL


from Batallas b join b.legiones l
where l.general.nombre = 'Quinto Varro'

Sistemas y Telecomunicaciones < Nombre del Documento >


46 < Fecha del Documento >

46
Ejemplos de HQL. Ejemplo 2.

¿Todas las legiones al mando del consul Quinto Varro ?

SQL

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


47 < Fecha del Documento >

47
Ejemplos de HQL. Ejemplo 2.

¿Todas las legiones al mando del consul Quinto Varro ?

select l.ID_LEGIONES , l.nombre , l.FK_ID_PATRICIOS


from Legiones l, Patricios p
where l.FK_ID_PATRICIOS=p.ID_PATRICIOS SQL
and p.nombre='Quinto Varro'

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


47 < Fecha del Documento >

47
Ejemplos de HQL. Ejemplo 2.

¿Todas las legiones al mando del consul Quinto Varro ?

select l.ID_LEGIONES , l.nombre , l.FK_ID_PATRICIOS


from Legiones l, Patricios p
where l.FK_ID_PATRICIOS=p.ID_PATRICIOS SQL
and p.nombre='Quinto Varro'

from Legiones l HQL


where l.general.nombre = 'Quinto Varro'

Sistemas y Telecomunicaciones < Nombre del Documento >


47 < Fecha del Documento >

47
Ejemplos de HQL. Ejemplo 3.

¿Numero de Legionarios de la legion tercerar hispanica ?

SQL

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


48 < Fecha del Documento >

48
Ejemplos de HQL. Ejemplo 3.

¿Numero de Legionarios de la legion tercerar hispanica ?

select count(l.ID_LEGIONARIOS)
from Legionarios l, Legiones legiones
SQL
where l.FK_ID_LEGIONES=legiones.ID_LEGIONES
and legiones.nombre='tercera hispanica'

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


48 < Fecha del Documento >

48
Ejemplos de HQL. Ejemplo 3.

¿Numero de Legionarios de la legion tercerar hispanica ?

select count(l.ID_LEGIONARIOS)
from Legionarios l, Legiones legiones
SQL
where l.FK_ID_LEGIONES=legiones.ID_LEGIONES
and legiones.nombre='tercera hispanica'

select count (l) from Legionarios l HQL


where l.legion.nombre = 'tercera hispanica'

Sistemas y Telecomunicaciones < Nombre del Documento >


48 < Fecha del Documento >

48
Ejemplos de HQL. Ejemplo 4.

¿Numero de Legionarios a las ordenes de Quinto Varro ?

select count(l.ID_LEGIONARIOS)
from Legionarios l, Legiones legiones , PATRICIOS p
where l.FK_ID_LEGIONES=legiones.ID_LEGIONES
and p.nombre='Quinto Varro' SQL
and legiones.fk_id_patricios = p.ID_PATRICIOS
and legiones.id_legiones = l.fk_id_legiones

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


49 < Fecha del Documento >

49
Ejemplos de HQL. Ejemplo 4.

¿Numero de Legionarios a las ordenes de Quinto Varro ?

select count(l.ID_LEGIONARIOS)
from Legionarios l, Legiones legiones , PATRICIOS p
where l.FK_ID_LEGIONES=legiones.ID_LEGIONES
and p.nombre='Quinto Varro' SQL
and legiones.fk_id_patricios = p.ID_PATRICIOS
and legiones.id_legiones = l.fk_id_legiones

select count (l ) from Legionarios l HQL


where l.legion.general.nombre = 'Quinto Varro'

Sistemas y Telecomunicaciones < Nombre del Documento >


49 < Fecha del Documento >

49
Ejemplos de HQL. Ejemplo 5.

¿Todos los consules que fueron derrotados en Cannae ?

SQL

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


50 < Fecha del Documento >

50
Ejemplos de HQL. Ejemplo 5.

¿Todos los consules que fueron derrotados en Cannae ?

select distinct p.nombre


from BATALLAS b, BATALLAS_LEGIONES bl, LEGIONES l,
PATRICIOS p
where b.ID_BATALLAS = bl.ID_BATALLAS SQL
and bl.ID_LEGIONES = l.ID_LEGIONES
and l.FK_ID_PATRICIOS = p.ID_PATRICIOS
and b.NOMBRE = 'cannae'

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


50 < Fecha del Documento >

50
Ejemplos de HQL. Ejemplo 5.

¿Todos los consules que fueron derrotados en Cannae ?

select distinct p.nombre


from BATALLAS b, BATALLAS_LEGIONES bl, LEGIONES l,
PATRICIOS p
where b.ID_BATALLAS = bl.ID_BATALLAS SQL
and bl.ID_LEGIONES = l.ID_LEGIONES
and l.FK_ID_PATRICIOS = p.ID_PATRICIOS
and b.NOMBRE = 'cannae'

from Patricios p join p.legiones l join batallas b


where b.nombre = ‘cannae’
HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


50 < Fecha del Documento >

50
Ejemplos de HQL. Ejemplo 5.

¿Todos los consules que fueron derrotados en Cannae ?

select distinct p.nombre


from BATALLAS b, BATALLAS_LEGIONES bl, LEGIONES l,
PATRICIOS p
where b.ID_BATALLAS = bl.ID_BATALLAS SQL
and bl.ID_LEGIONES = l.ID_LEGIONES
and l.FK_ID_PATRICIOS = p.ID_PATRICIOS
and b.NOMBRE = 'cannae'

from Patricios p join p.legiones l join batallas b


where b.nombre = ‘cannae’
HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


50 < Fecha del Documento >

50
Ejemplos de HQL. Ejemplo 5.

¿Todos los consules que fueron derrotados en Cannae ?

select distinct p.nombre


from BATALLAS b, BATALLAS_LEGIONES bl, LEGIONES l,
PATRICIOS p
where b.ID_BATALLAS = bl.ID_BATALLAS SQL
and bl.ID_LEGIONES = l.ID_LEGIONES
and l.FK_ID_PATRICIOS = p.ID_PATRICIOS
and b.NOMBRE = 'cannae'

from Patricios p join p.legiones l join batallas b


where b.nombre = ‘cannae’
HQL
select distinct g.nombre
from Batallas b join b.legiones l join l.general g
where b.nombre = 'cannae'

Sistemas y Telecomunicaciones < Nombre del Documento >


50 < Fecha del Documento >

50
Ejemplos de HQL. Ejemplo 6.

¿cuantas victorias ha conseguido cada una de las familias de Roma ?

select count(b.VICTORIA) ,f.NOMBRE


from PATRICIOS p,
LEGIONES l,
BATALLAS_LEGIONES bl,
BATALLAS b,FAMILIAS f
where b.VICTORIA = 1
SQL
and b.ID_BATALLAS = bl.ID_BATALLAS
and l.ID_LEGIONES = bl.ID_LEGIONES
and p.ID_PATRICIOS = l.FK_ID_PATRICIOS
and f.ID_FAMILIAS = p.FK_ID_FAMILAS
group by f.NOMBRE

HQL

Sistemas y Telecomunicaciones < Nombre del Documento >


51 < Fecha del Documento >

51
Ejemplos de HQL. Ejemplo 6.

¿cuantas victorias ha conseguido cada una de las familias de Roma ?

select count(b.VICTORIA) ,f.NOMBRE


from PATRICIOS p,
LEGIONES l,
BATALLAS_LEGIONES bl,
BATALLAS b,FAMILIAS f
where b.VICTORIA = 1
SQL
and b.ID_BATALLAS = bl.ID_BATALLAS
and l.ID_LEGIONES = bl.ID_LEGIONES
and p.ID_PATRICIOS = l.FK_ID_PATRICIOS
and f.ID_FAMILIAS = p.FK_ID_FAMILAS
group by f.NOMBRE

select f.nombre, count(*)


from Batallas b HQL
join b.legiones l join l.general g join g.familia f
where b.victoria = true
group by f.nombre

Sistemas y Telecomunicaciones < Nombre del Documento >


51 < Fecha del Documento >

51
Hibernate.

QBE.
Sistemas y Telecomunicaciones < Nombre del Documento >
52 < Fecha del Documento >

52
Mas alla del HQL. QBE.

package com.endesa.ame4j.imperium.modelo;

import java.io.Serializable;

public class Patricios implements Serializable{

private Long id ;
private String nombre;
private Integer edad;
}

Selección de Patricios

Nombre

Edad

Aceptar Cancelar

Sistemas y Telecomunicaciones < Nombre del Documento >


53 < Fecha del Documento >

53
Mas alla del HQL. QBE.

String cadena = “from Patricios p”;


[...]
if (patricios.getNombre() != null)
cadena += “and p.nombre = ” + patricios.getNombre();
if (patricios.getEdad() != null)
cadena += “and p.edad = ” + patricios.getEdad();
[...]
Collection lista = sesion.createQuery(cadena).list();

return lista

Sistemas y Telecomunicaciones < Nombre del Documento >


54 < Fecha del Documento >

54
Mas alla del HQL. QBE.

String cadena = “from Patricios p”;


[...]
if (patricios.getNombre() != null)
cadena += “and p.nombre = ” + patricios.getNombre();
if (patricios.getEdad() != null)
cadena += “and p.edad = ” + patricios.getEdad();
[...]
Collection lista = sesion.createQuery(cadena).list();

return lista

public List buscarPorCriterios( Patricios consul){

Criteria criterios = sesion.createCriteria(Patricios.class);


criterios.add(Example.create(consul));

return criterios.list();
}

Sistemas y Telecomunicaciones < Nombre del Documento >


54 < Fecha del Documento >

54
Hibernate.

QBC.
Sistemas y Telecomunicaciones < Nombre del Documento >
55 < Fecha del Documento >

55
Mas alla del HQL. QBC.

public List buscarPorCriterios( Patricios consul){

Example ejemplo = Example.create(consul).ignoreCase().enableLike();


ejemplo = ejemplo.enabledLike(MachMode.ANYWHERE);

return sesion.createCriteria(Patricios.class).add(ejemplo).list();

Sistemas y Telecomunicaciones < Nombre del Documento >


56 < Fecha del Documento >

56
Hibernate.

SQL.
Sistemas y Telecomunicaciones < Nombre del Documento >
57 < Fecha del Documento >

57
Mas alla del HQL. SQL.

¿Y que pasa si necesito ejecutar SQL?

Sistemas y Telecomunicaciones < Nombre del Documento >


58 < Fecha del Documento >

58
Mas alla del HQL. SQL.

¿Y que pasa si necesito ejecutar SQL?

Obtener una conexion y trabajar con jdbc

Sistemas y Telecomunicaciones < Nombre del Documento >


58 < Fecha del Documento >

58
Mas alla del HQL. SQL.

¿Y que pasa si necesito ejecutar SQL?

Obtener una conexion y trabajar con jdbc

Usar las funciones del api de hibernate para trabajar con sql.

Sistemas y Telecomunicaciones < Nombre del Documento >


58 < Fecha del Documento >

58
Mas alla del HQL. SQL.

¿Y que pasa si necesito ejecutar SQL?

Obtener una conexion y trabajar con jdbc

Usar las funciones del api de hibernate para trabajar con sql.

public List buscarPorCriterios( Patricios consul){

String sentenciaSQL = "select p.nombre as {patricios.nombre}, “


sentenciaSQL += “ p.edad as {patricios.edad} " ;
sentenciaSQL += "from Patricios p"

return sesion.createSQLQuery(sentenciaSQL,"patricios",Patricios.class).list();

Sistemas y Telecomunicaciones < Nombre del Documento >


58 < Fecha del Documento >

58
Mas alla del HQL. SQL.

¿Y que pasa si necesito ejecutar SQL?

Obtener una conexion y trabajar con jdbc

Usar las funciones del api de hibernate para trabajar con sql.

public List buscarPorCriterios( Patricios consul){

String sentenciaSQL = "select p.nombre as {patricios.nombre}, “


sentenciaSQL += “ p.edad as {patricios.edad} " ;
sentenciaSQL += "from Patricios p"

return sesion.createSQLQuery(sentenciaSQL,"patricios",Patricios.class).list();

Posibilidad de llamar a procedimientos almacenadados.

Sistemas y Telecomunicaciones < Nombre del Documento >


58 < Fecha del Documento >

58
Mas alla del HQL. SQL. ibatis.

¿Y puedo declarar el sql en un fichero


externo como hace ibatis?

Sistemas y Telecomunicaciones < Nombre del Documento >


59 < Fecha del Documento >

59
Mas alla del HQL. SQL. ibatis.

¿Y puedo declarar el sql en un fichero


externo como hace ibatis?
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">


<class name="Patricios">
<id name="id" type="long" >
<column name="ID_PATRICIOS" />
<generator class="native"/>
</id>
<property name="nombre" type="string" length="50"/>
<property name="edad" type="integer" />
</class>

</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


59 < Fecha del Documento >

59
Mas alla del HQL. SQL. ibatis.

¿Y puedo declarar el sql en un fichero


externo como hace ibatis?
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.endesa.ame4j.imperium.modelo" default-access="field">


<class name="Patricios">
<id name="id" type="long" >
<column name="ID_PATRICIOS" />
<generator class="native"/>
</id>
<property name="nombre" type="string" length="50"/>
<property name="edad" type="integer" />
</class>

<sql-query name="consultasql">
select {p.*} from Patricios p
where p.edad = 35
<return alias="consul" class="Patricios"></return>
</sql-query>

</hibernate-mapping>

Sistemas y Telecomunicaciones < Nombre del Documento >


59 < Fecha del Documento >

59
Mas alla del HQL. SQL. ibatis.II

public List damePosiblesConsules(){

Query q = session.getNamedQuery("sentenciaSQL");
List resultado = q.list();

return resultado;
}

Sistemas y Telecomunicaciones < Nombre del Documento >


60 < Fecha del Documento >

60
Mas alla del HQL. SQL. ibatis.II

public List damePosiblesConsules(){

Query q = session.getNamedQuery("sentenciaSQL");
List resultado = q.list();

return resultado;
}

Como ibatis. Es posible usar hibernate como si trabajara


con ibatis.
Nos ofrece todas sus posibles ventajas y ninguno de sus
inconvenientes.

Sistemas y Telecomunicaciones < Nombre del Documento >


60 < Fecha del Documento >

60
Hibernate.

Resumen.
Sistemas y Telecomunicaciones < Nombre del Documento >
61 < Fecha del Documento >

61
Resumen. Virtudes del uso Hibernate para el acceso datos.

Sistemas y Telecomunicaciones < Nombre del Documento >


62 < Fecha del Documento >

62
Resumen. Virtudes del uso Hibernate para el acceso datos.

Hibernate nos proporciona distintas formas de acceder a


Flexibilidad: los datos. HQL,QBC,QBE,SQL, Codigo, procedimientos
almacenados.

Sistemas y Telecomunicaciones < Nombre del Documento >


62 < Fecha del Documento >

62
Resumen. Virtudes del uso Hibernate para el acceso datos.

Hibernate nos proporciona distintas formas de acceder a


Flexibilidad: los datos. HQL,QBC,QBE,SQL, Codigo, procedimientos
almacenados.

El hecho de tener varias formas de acceder a los datos hace


Potencia: podamos escoger el mejor sistema siempre para conseguir
nuestros resultados.Navegar por los objetos , sql, etc.

Sistemas y Telecomunicaciones < Nombre del Documento >


62 < Fecha del Documento >

62
Resumen. Virtudes del uso Hibernate para el acceso datos.

Hibernate nos proporciona distintas formas de acceder a


Flexibilidad: los datos. HQL,QBC,QBE,SQL, Codigo, procedimientos
almacenados.

El hecho de tener varias formas de acceder a los datos hace


Potencia: podamos escoger el mejor sistema siempre para conseguir
nuestros resultados.Navegar por los objetos , sql, etc.

El uso de HQL hace que nuestras consultas sean facilmente


Adaptabilidad: adaptable a los cambios en el motor de la base de datos o de
la estructura de la base de datos. El HQL trabaja sobre
objetos. Parecido a odms.

Sistemas y Telecomunicaciones < Nombre del Documento >


62 < Fecha del Documento >

62
Resumen. Virtudes del uso Hibernate para el acceso datos.

Hibernate nos proporciona distintas formas de acceder a


Flexibilidad: los datos. HQL,QBC,QBE,SQL, Codigo, procedimientos
almacenados.

El hecho de tener varias formas de acceder a los datos hace


Potencia: podamos escoger el mejor sistema siempre para conseguir
nuestros resultados.Navegar por los objetos , sql, etc.

El uso de HQL hace que nuestras consultas sean facilmente


Adaptabilidad: adaptable a los cambios en el motor de la base de datos o de
la estructura de la base de datos. El HQL trabaja sobre
objetos. Parecido a odms.

Podemos llevar nuestras sentencias a ficheros de hibernate, o


Configurable: a el código, o a ficheros de propiedades , o a xml, o a
empaquetadores de recursos, o a donde queramos

Sistemas y Telecomunicaciones < Nombre del Documento >


62 < Fecha del Documento >

62
Resumen. Virtudes del uso Hibernate para el acceso datos.

Hibernate nos proporciona distintas formas de acceder a


Flexibilidad: los datos. HQL,QBC,QBE,SQL, Codigo, procedimientos
almacenados.

El hecho de tener varias formas de acceder a los datos hace


Potencia: podamos escoger el mejor sistema siempre para conseguir
nuestros resultados.Navegar por los objetos , sql, etc.

El uso de HQL hace que nuestras consultas sean facilmente


Adaptabilidad: adaptable a los cambios en el motor de la base de datos o de
la estructura de la base de datos. El HQL trabaja sobre
objetos. Parecido a odms.

Podemos llevar nuestras sentencias a ficheros de hibernate, o


Configurable: a el código, o a ficheros de propiedades , o a xml, o a
empaquetadores de recursos, o a donde queramos

No necesitamos un DBA, para crear nuestra BBDD. Solo


Independencia: necesitamos saber java. Ni un cliente de Oracle.

Sistemas y Telecomunicaciones < Nombre del Documento >


62 < Fecha del Documento >

62
Resumen. Virtudes del uso Hibernate para el acceso datos.

Hibernate nos proporciona distintas formas de acceder a


Flexibilidad: los datos. HQL,QBC,QBE,SQL, Codigo, procedimientos
almacenados.

El hecho de tener varias formas de acceder a los datos hace


Potencia: podamos escoger el mejor sistema siempre para conseguir
nuestros resultados.Navegar por los objetos , sql, etc.

El uso de HQL hace que nuestras consultas sean facilmente


Adaptabilidad: adaptable a los cambios en el motor de la base de datos o de
la estructura de la base de datos. El HQL trabaja sobre
objetos. Parecido a odms.

Podemos llevar nuestras sentencias a ficheros de hibernate, o


Configurable: a el código, o a ficheros de propiedades , o a xml, o a
empaquetadores de recursos, o a donde queramos

No necesitamos un DBA, para crear nuestra BBDD. Solo


Independencia: necesitamos saber java. Ni un cliente de Oracle.

Todos los cambios se realizan en unico sitio. No necesitamos


Agilidad: mantener varios fichero para realizar un unico cambio.
Problemas mantenimiento.
Sistemas y Telecomunicaciones < Nombre del Documento >
62 < Fecha del Documento >

62
Hibernate. Otra Forma de Configurar.

Otra forma de configurar

Sistemas y Telecomunicaciones < Nombre del Documento >


63 < Fecha del Documento >

63
Hibernate. Otra forma de Configurar.

¿Que necesitamos para configurar Hibernate?

Los archivos jar.


Las clases del modelo
El fichero de Spring
Los ficheros xml con la relacion

Sistemas y Telecomunicaciones < Nombre del Documento >


64 < Fecha del Documento >

64
Hibernate. Otra forma de Configurar.

¿Que necesitamos para configurar Hibernate?

Los archivos jar.


Las clases del modelo
El fichero de Spring

Sistemas y Telecomunicaciones < Nombre del Documento >


65 < Fecha del Documento >

65
Clase Patricios
Los métodos
get y set se han
suprimido por
claridad.
package com.endesa.ame4j.imperium.modelo;
import javax.persistence.*;
@Entity
public class Patricios implements java.io.Serializable {
@Id @GeneratedValue
@Column(name="ID_PATRICIOS")
private long id;
private String nombre;
private Integer edad;
public Patricios() {
}

public Patricios(String nombre, Integer edad) {


this.nombre = nombre;
this.edad = edad;
}
}

Sistemas y Telecomunicaciones < Nombre del Documento >


66 < Fecha del Documento >

66
Clase Legionarios
Los métodos
get y set se han
suprimido por
claridad.
package com.endesa.ame4j.imperium.modelo;
import javax.persistence.*;
@Entity
public class Legionarios implements java.io.Serializable {
@Id @GeneratedValue
@Column(name="ID_LEGIONARIOS", unique=false, nullable=false, insertable=true,updatable=true)
private long id;
private String nombre;

@ManyToOne(cascade={},fetch=FetchType.LAZY)
@JoinColumn(name="FK_ID_LEGIONES",unique=false, nullable=false,insertable=true,updatable=true)
private Legiones legion;

@ManyToOne(cascade={},fetch=FetchType.LAZY)
@JoinColumn(name="FK_ID_JEFE", unique=false, nullable=true, insertable=true, updatable=true)
private Legionarios jefe;

Sistemas y Telecomunicaciones < Nombre del Documento >


67 < Fecha del Documento >

67
Hibernate. Imperium.

Fin.
Sistemas y Telecomunicaciones < Nombre del Documento >
68 < Fecha del Documento >

68

También podría gustarte