15.

Hibernate
Duración: 6 horas.
Objetivos
Estudiar el framework Hibernate y aprender a hacer consultas sobre una base de
datos usándolo.
Introducción
Como se ha comentado en el módulo anterior, el framework Hibernate extrae al
programador de la tarea de preocuparse de las sentencias SQL que debe de realizar
para transformar una información estructurada en objetos a una estructura de base
de datos relacional y viceversa.
Configuración del Proyecto
Para poder trabajar con Hibernate, es necesario tener los siguientes módulos en el
ClassPath del proyecto:
hibernate3.jar
dom4j.jar
hibernate-annotations.jar
commons-logging.jar
log4j.jar
commons-collection.jar
cglib.jar
antlr.jar
jboss-j2ee.jar
Si se va a trabajar con MySQL, también se tendrá que incluir:
mysql-connector-java-5.1.5-bin.jar
Definición de relación entre Clase y Tabla
Para definir la relación que hay entre una clase y una tabla SQL se utiliza un fichero
XML con un formato específico. Por otra parte, la clase debe ser muy sencilla y con
unas restricciones parecidas a un JavaBean. Por ejemplo:
Factura.java
package pers;
public class Factura {
private int id;
private String cliente;
public Factura() {
}
getters/setters
}
Factura.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
1
Curso de formación para D-Core (febrero 2008) Heliodoro Tejedor
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="pers.Factura" table="facturas">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="cliente" column="cliente" />
</class>
</hibernate-mapping>
Y con el siguiente código principal se introduciría una nueva factura:
Ejemplo.java
package pers;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class Ejemplo {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration()
.configure()
.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Factura factura = new Factura();
factura.setCliente(°Pepe¨);
session.save(factura);
transaction.commit();
}
}
Para tener configurada correctamente la conexión con la base de datos, se debe de
crear un fichero en el directorio raiz con la siguiente información:
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/dcore
</property>
2
Curso de formación para D-Core (febrero 2008) Heliodoro Tejedor
<property name="hibernate.connection.username">defuser</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mapping files -->
<mapping resource="pers/Factura.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Consultas
Para buscar dentro de una tabla un determinado registro sabiendo su clave
primaria, se puede ejecutar el siguiente algoritmo:
Factura factura = (Factura) session.load(Factura.class, 5);
Si el registro no existiese, se lanzaría la excepción:
org.hibernate.ObjectNotFoundException
Para buscar una lista de elementos:
List result = session.createQuery(°from Factura¨).list();
for(Object o: result) {
Factura f = (Factura) o;
...
}
Y para obtener una lista de elementos que cumplan un cierto criterio:
List result = session.createQuery(°from Factura where id > :id¨)
.setInteger(°id¨, 6)
.list();
for(Object o: result) {
Factura f = (Factura) o;
...
}
Inserción
Para insertar un nuevo elemento, solo es necesario crear una instancia de la clase y
llamar al método "save¨ de la sesión:
Factura factura = new Factura();
factura.setCliente(°Pepito perez¨);
session.save(factura);
Si el elemento a guardar tiene una clave primaria que ya existe en la tabla, se
creará un nuevo elemento y se le modificará la clave.
Modificación
Si se tiene una instancia de un elemento y la clave primaria ya existiese en la base
3
Curso de formación para D-Core (febrero 2008) Heliodoro Tejedor
de datos, al llamar al método "saveOrUpdate¨, se modificaría el elemento de la
tabla.
También existe el método "update¨ que, si el elemento existe en la tabla, lo
modifica, de lo contrario fallaría con la excepción:
org.hibernate.ObjectNotFoundException
Borrado
A partir de una referencia a un elemento, se puede ejecutar el método "delete¨ de
la sesión.
session.delete(factura);
Transacciones
Para trabajar con la base de datos, Hibernate permite crearse transacciones. Se
inicia la transacción con el método "beginTransaction¨ de la sesión, se trabaja con
las herramientas anteriores y, una vez finalizadas, se especifica si se quiere validar
los cambios (commit) o deshacerlos (rollback). Por ejemplo:
package pers;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class Ejemplo {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration()
.configure()
.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Factura factura = new Factura();
factura.setCliente(°Pepe¨);
session.save(factura);
transaction.rollback();
}
}
Relación simple entre tablas (one-to-one)
Si dos tablas están relacionadas por una clave única una-a-una, se debe de
especificar en el fichero xml de cada una de las tablas de la siguiente forma:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="pers.Factura" table="facturas">
<id name="id" column="id">
<generator class="native" />
</id>
4
Curso de formación para D-Core (febrero 2008) Heliodoro Tejedor
<property name="cliente" column="cliente" />
<one-to-one name=¨id¨ class=¨pers.FacturaPrivada¨ />
</class>
</hibernate-mapping>
Siendo "FacturaPrivada¨ una clase donde se guarda, por ejemplo, información que
no se desea guardar en la tabla de facturas.
Relación uno-a-varios
Si en el ejemplo de las facturas se desea incluir una tabla de detalles de la factura,
la relación se haría de la siguiente manera:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="pers.Factura" table="facturas">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="cliente" column="cliente" />
<set name="detalles" cascade="all">
<key column="factura_id" />
<one-to-many class="pers.Detalle" />
</set>
</class>
</hibernate-mapping>
Se tendría que incluir un Set (del Collection Framework) en la clase de la Factura:
package pers;
import java.util.*;
public class Factura {
private int id;
private String cliente;
private Collection<Detalle> detalles;
public Factura() {
detalles = new HashSet<Detalle>();
}
public Collection<Detalle> getDetalles() {
return detalles;
}
public void setDetalles(Collection<Detalle> detalles) {
this.detalles = detalles;
}
}
La correspondiente clase de Detalle:
5
Curso de formación para D-Core (febrero 2008) Heliodoro Tejedor
package pers;
public class Detalle {
private int id;
private int facturaId;
private String producto;
private int cantidad;
public Detalle() {
}
public Detalle(String producto, int cantidad) {
this.producto = producto;
this.cantidad = cantidad;
}
... setters/getters
}
Y su definición:
Detalle.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="pers.Detalle" table="detalles">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="producto" column="producto" />
<property name="cantidad" column="cantidad" />
</class>
</hibernate-mapping>
Para trabajar con el detalle de la factura:
Factura factura = new Factura();
factura.setCliente("Pepe Perez");
factura.getDetalles().add(new Detalle("Producto1", 100));
factura.getDetalles().add(new Detalle("Producto2", 300));
session.saveOrUpdate(factura);
Prácticas
Almacén
Implementar la gestión del almacén usando Hibernate. Empezad por crear una
aplicación que gestione la información del cliente. Después las facturas y finalmente
el almacén y la gestión de stock.
6

G.

  Objetivos   .

.

 $ \.

 ..

.

   .

.

  .

&   .

   .

 .

.

 .

.

Introducción 1.

.

 .

  .

 .

.

  .

  ".

.

 $ \.

. .

0 .

.

    .

.

 .

  .

.

   .

.

 .

  .

4A+.

. .

.

.

  # .

 .

   .

.

  .

   .

 .

.

.

.

  .

.

 .

.

 .

  .

.

    Configuración del Proyecto L .

 .

   .

 .

 "..

.

  1 L .

.

     H I   O      O  I  O         OD 4 .

.

 .

.

   .

 .

*4A+".

  / .

.

  &.

. .

  .

  .

.

  .

  .

 .

.

O    O  O F O  Definición de relación entre Clase y Tabla L . .

 .

 .

 .

..

 .

  .

.

 .

.

.

  .

4A+.

.

  # .

.

  .

b*+.

 .

.

  .

  .

L .

 .

 ".

 .

 .

.

 .

 .

  .

.

 .

.

  .

   .

.

.

!  3 .

L .

  . .

  # 4 EM.   ! #         F   4   :  #   >? 4   F 9 # 9 .

    1W&%'W    #1W BHW MG .

.

 .

.

 ECPDR-< WB W E    V  I        B.

QTR V  % Y  # P-P 5%'   # %   OW B.  # <a.

 #B5%'% WG   B.

 #G .

1W  %F  W  1W  WG E  E .

1WW  .

1WWG E#  E G E   " .

1W  E  E   G W  .

1W  W G   1W  W G B.

 #G a.

 .

.

  .

 .

  .

.

   .

.

 .

  .

 .

  ! #    .

  .

  #%  #%  * .

 %  % #%  4         .

 >:  #/0 # ? 4 :  F "  F " 1 $ R #   >? % #  >? % : :   1  F ">? "%  :  >?  F -  F     %   1  1 $ F R >.<  =?  ?  % # -  >?  >?  %  >   % .

.

 >? 9 9 L  .

  .

   .

    .

 .

 0 .

 .

 .

 .

.

 ".

.

.

.

.

.

  .

 .

.

   .

#.

 .

 .

  .

  #  5+4 EM.

QTR V  % R #   P-P   # %   OW B #   B5%'% WG   B #   G "G %  % (  WG  B E   " .    1]&%'] ECPDR-< WB W E  E   V  I  #1] BH]MG B #   <a.

1W    3 P .

   E    "G E   " .

1W  .

 3 P AA E    "G  # %  % WG A    .

.

 .

.

    %  % %  % %  %  .

WG 5   E    "G   E   " .

1W  E   " .

1W  E   " .

1W  $ WGE    "G (  WG&'E    "G E   " .

1W  $( WG  E    "G %  %Y":cQP  E    "G WG  E    "G E   " .

1W  WG #%  E   " .

1W  ECBB Y  #  E.

 #  E  B BBG %.

7%  1W  A.  "G  # 4 W G E   B #   G Consultas L .

  .

  .

.

.

  .

.

  .

  .

   .

 .

 .

  ".

.

 .

  .

.

  .

   F    1 >F  ?  % >F  %  @? 4 .

.

  .

.

0  ".

.

 # #%  %D* O F  .

 .

0      L .

  Q  .

.

  .

.

 .   1 I   %   ? 4  ?  c ">.

F  =?% >?  >D* F %%% 9   1 >F a.

 .

  .

.

  .

.

 .

..

= 3? c  . Q  % %  >D* F %%% 9  1 T >? I   ? 4  ?   %  # >.

.

 .

 $    ">. .

F  G I=?   1 >F Inserción L .

  .

.

.

 ".

.

.

    .

.

/.

8 :.

.

 .

 F     %  1 $ F R >.<   ?  >?   =? .

 .

.

 .

.

 .

 .

.

 %  > 4 .

.

 .

.

 .

  .

.

 .

  .

..

 .

0 .

 .

 .

  ".

.

 &.

.

.

 .

.

.

.

  &.

 .

  Modificación 4 .

.

  .

.

 .

.

.

 .

.

 .

 .

   .

 .

0  .

 .

 .

 .

.

.

 .

.

        .

 ".

.

     .

.

/.

8 > B :".

.

   .

.

 .

.

 .

<  / .

0 .

.

/.

8  :.

. ".

 .

.

 .

0 .

 .

 .

  ".

.

  ".

.

.

  .

   .

 .

 .

0  #%  %D* O F     Borrado %.

  .

.

.

   .

   %  > .

.

.

 ".

.

 .

  ?  .

.

/.

8:.

.

Transacciones L .

   .

 .

 .

 .

.

 ".

 ..

  .

 .

   .

4.

.

 .

  .

 .

.

/.

8 <    :.

.

 .

 ".

.

   .

 .

 .

    .

  .

".

.

#.

  #  ".

.

  .

 .

.

.  .

   .

.

 .

?  @.

.

  .

?  \@.

L .

  ! # .

  .

     #%  #%  * .

 %  % #%  4         .

 >:  #/0 # ? 4 :  F "  F " 1 $ R #   >? % #  >? % : :   1  F ">? "%  :  >?  F -  F     %   1  1 $ F R >.<  =?  ?  % # -  >?  >?  %  >   % 9 9  %>? Relación simple entre tablas (one-to-one) 4 .

.

  .

& .

   .

 .

.

 .

7 .

O O ".

.

.

.

  .

 .

.

  .

0.

.

 .

.

.

 .

  .

.

 .

  .

  ECPDR-< WB W E    V  I B.

 # <a.QTR V  % Y  # P-P 5%'   # %   OW B.

 #B5%'% WG   B.

 #G .

1W  %F  W  1W  WG E  E .

1WW  .

1WWG E#  E G   1W  W G .

.

 .

.

    W  .

1W  >C  .  W G     E   " .

1W  Q  R E  E   G R   >C C   CAS B.

 #G 4  .

8.  .

.

 .

L   :.

.

 .

 .

.

 .

 .

 .

  .

.

    ".

 .

".

  .

. .

Relación uno-a-varios 4 .

 .

.

.

.

 .

   .

 .

.

  .

.

 .

 ECPDR-< WB W E    V  I .

.

 .

  .

  .

.

  .

.

 .

.

 .

  ".

B.

 # <a.QTR V  % Y  # P-P 5%'   # %   OW B.

 #B5%'% WG   B.

 #G .

1W  %F  W  1W  WG E  E .

1WW  .

1WWG E#  E G E   " .

1W  Q  >N Q% 3 Q  R N >N5  R 3 W  .

1W   >N NS W G   1W  W G  G NAS >N   NAS QA E  E   G B.

 #G S 4.

   .

..

  ! # .

     *  % .

.

4.

?.

1   .

%  $ \@..

 .

 .

 .

.

 .

1   Q / S .1 + .        F   4   S / :  #     Q  >? 4   F > ." 9     2      #  2 9 * >   Q  / #$ Q S*../ S+ *.

    .

 .

.

  ! .

.

 .

.

  ! #    P    4                  T  :  #       >? 4   P 9   P  >:  #    %  1      ? 4  %   1   9 %%%  #  9     N I # 4 EM.

    1W&%'W ECPDR-< WB W   V  I  #1W BHW MG B.

QTR V  % Y  # P-P 5%'   # %   OW B.  # <a.

 #B5%'% WG   E  B.

 #G .

1W  %P  W  1W  WG E  E .

1WW  .

1WWG E#  E G E   " .

1W  W  .

1W  W G G   1W  W G E   " .

1W  W  .

1W  W E  E   G B.

 #G L .

   F    .

 .

.

 .

.

 .

  1 $ F R P P   >W<      %  %#  %#  >? <  W?  >W<   >W<  &W 7W &''?? 5''?? >?% > $ P >?% > $ P >  ?  %  Da Prácticas Almacén )  .

 .

 .

.

 / .

 .

. .

# .

 .

 .

.

 .

. .

  .

 .

  .

.

  .

 /.

 .

  .

.

  .

.

 / .

.

 .

 .

.

 \ " .

Sign up to vote on this title
UsefulNot useful