Anda di halaman 1dari 0

Curso: "Java EE y Frameworks" 2013

Hibernate ORM
Mdulo 5 / parte 1


Todos los logos y marcas utilizados en este
documento, estn registrados y pertenecen a
sus respectivos dueos.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 1

Curso: "Java EE y Frameworks" 2013

Introduccin
El Desarrollo de hoy en da con software orientado a objetos y bases de datos relacionales puede
hacernos invertir bastante tiempo, sobre todo si trabajos con varias tablas que se relacionan entre s.
Hibernate es un framework de persistencia, open source, que nos facilita ste trabajo, permitiendo
convertir datos entre el mundo de programacin orientado a objetos y el utilizado en una base de datos
de entidad relacional. En la prctica esto crea una base de datos orientada a objetos virtual, sobre la
base de datos relacional en nuestro sistema.
sta tcnica es conocida con el nombre de ORM (object/relational mapping) y consiste en la tcnica de
realizar la transicin de una representacin de los datos de un modelo relacional a un modelo orientado
a objetos y viceversa.
Hibernate no solo realiza esta sta transformacin sino que nos proporciona capacidades para la
obtencin y almacenamiento de datos de la base de datos que nos reducen el tiempo de desarrollo.
Hibernate trabaja asociando cada tabla de la base de datos a una clase Plain Old Java Object (Entity o ,
a veces llamado Plain Ordinary Java Object). Un POJO es similar a una Java Bean, con propiedades
accesibles mediante mtodos setter y getter.
Para poder asociar el POJO a su tabla correspondiente en la base de datos Hibernate usa los archivos de
configuracin hbm.xml que adems mapea los campos de la tabla hacia los atributo de la clase.
Hibernate convertir los datos entre los tipos utilizados por Java y los definidos por SQL. Hibernate
genera las sentencias SQL y libera al desarrollador del manejo manual de los datos que resultan de la
ejecucin de dichas sentencias, manteniendo la portabilidad entre todos los motores de bases de datos
con un ligero incremento en el tiempo de ejecucin.
Hibernate est diseado para ser flexible en cuanto al esquema de tablas utilizado, para poder
adaptarse a su uso sobre una base de datos ya existente. Tambin tiene la funcionalidad de crear la base
de datos a partir de la informacin disponible.
Hibernate ofrece tambin un lenguaje de consulta de datos llamado HQL (Hibernate Query Language), al
mismo tiempo que una API para construir las consultas programticamente (conocida como "criteria").

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 2

Curso: "Java EE y Frameworks" 2013

Objetivo
El objetivo del laboratorio es aprender las funciones principales de Hibernate. A pesar de que vamos a
construir una aplicacin relativamente simple con Hibernate, obtendremos un concepto bastante
completo sobre Hibernate.

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 3

Curso: "Java EE y Frameworks" 2013

Ejercicio 1: Iniciar la Base de Datos Apache Derby y Crear la base de
datos ejemplo_hibernate

En este ejercicio vamos a iniciar el servicio del motor de base de datos Derby y crearemos un nuevo
recurso de conexin JDBC para luego crear la base de datos ejemplo_hibernate para utilizarla en los
ejemplos de hibernate.
Iniciar/levantar el servicio de la base de datos Java DB
1. Seleccionar la pestaa Services.
2. Expandir Databases
3. Clic-Derecho en Java DB y seleccionar Start Server



AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 4

Curso: "Java EE y Frameworks" 2013

Crear la Base de datos en Netbeans IDE
1. Clic-Derecho en Java DB y seleccionar Create Database

2. En el campo Database Name escribimos ejemplo_hibernate
3. En User Name tipeamos curso
4. En Password y Confirm Password, ingresamos javaee
5. Ok.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 5

Curso: "Java EE y Frameworks" 2013


6. Aparece una nueva conexin a la base de datos en Services bajo Databases
jdbc:derby://localhost:1527/ ejemplo_hibernate[curso on CURSO]


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 6

Curso: "Java EE y Frameworks" 2013

7. Clic Derecho sobre el string de conexin que aparece y seleccionar Connect

8. Clic en la pestaa Projects para Regresar a los proyectos.

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 7

Curso: "Java EE y Frameworks" 2013

Ejercicio 2: Construir una aplicacin Hola Mundo" Hibernate
1. Crear un nuevo Java Application Project
Seleccionar File->New Project (Ctrl+Shift+N)

Observamos que aparece la nueva ventana de dialogo New Project.
En el panel Choose Project, seleccionar Java bajo Categories y seleccionar Java
Application bajo Projects.
Clic en Next
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 8

Curso: "Java EE y Frameworks" 2013


En panel Name and Location, en el campo Project Name escribir HibernateHolaMundo.
Para Crear Main Class, verificar que est seleccionado.
Clic Finish.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 9

Curso: "Java EE y Frameworks" 2013


Observar que el proyecto HibernateHolaMundo aparece en la pestaa de proyectos
(panel Proyects) y el IDE ha creado la clase Main.java y se abre en el editor de cdigo de
NetBeans IDE. Luego modificaremos la clase Main.java para el ejemplo con hibernate.
2. Crear la clase Persona, como nota: es una clase POJO de Java
Clic derecho en el proyecto HibernateHolaMundo y seleccionar New->Java Class.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 10

Curso: "Java EE y Frameworks" 2013


Observamos que aparece la ventana New Java Class.
Para el nombre de la clase (Class Name), ingresamos Persona.
Para el campo Package, tipiamos hibernateholamundo.
Clic Finish.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 11

Curso: "Java EE y Frameworks" 2013


Modificamos la clase Persona tal como se muestra en el cdigo de abajo
package hibernateholamundo;
import java.io.Serializable;
public class Persona implements Serializable {
private int id;
private String nombre;

protected Persona() {
}
public Persona(int id, String nombre) {
this.id = id;
this.nombre = nombre;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 12

Curso: "Java EE y Frameworks" 2013


Una simple clase POJO de Hibernate.
Implementa la interfaz Serializable para que sta sea persistente en una sesin de
Hibernate, la que estar sincronizada con la base de datos.
La clase POJO Persona.java tendr asociado un archivo XML para mapearla hacia una
tabla de la base de datos, donde cada atributo de la clase estar mapeada a columnas
de la tabla.
Una buena prctica es tener un archivo hibrnate mapping (configuracin XML) por
cada clase POJO, pero sin embargo podramos tener un solo archivo de mapeo y ah
mapear varios POJOS.
3. Crear el archivo de configuracin hibernate mapping para la clase POJO Persona
En este archivo de mapeo, vamos a especificar que la clase Persona ser mapeada hacia
la tabla personas de la base de datos. El atributo id de la clase Persona ser usada
como la llave primaria (primary key) en la tabla de la base de datos. El atributo nombre
de la clase corresponder a la columna nombre de la tabla en la base de datos.
Clic derecho sobre el proyecto HibernateHolaMundo y Seleccionar New->Other


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 13

Curso: "Java EE y Frameworks" 2013


Observe que la ventana Choose File Type aparece.
Seleccionar XML bajo Categories en la izquierda y XML Document bajo File Types en la
derecha.
Clic Next.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 14

Curso: "Java EE y Frameworks" 2013


Observe que la ventana Name and Location aparece.
Para el nombre de archivo (File Name), ingresar Persona.hbm
Clic Browse en el campo Folder para seleccionar su ubicacin
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 15

Curso: "Java EE y Frameworks" 2013



AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 16

Curso: "Java EE y Frameworks" 2013

Seleccionar la carpeta src
Clic Select Folder

Clic Next
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 17

Curso: "Java EE y Frameworks" 2013


Clic Finish
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 18

Curso: "Java EE y Frameworks" 2013


Reemplazar el contenido generado por el IDE (en el archivo XML Persona.hbm) con el
contenido que sigue a continuacin:

Este es el archivo que une al mundo relacional y el de los objetos. El ejemplo, simple,
que presentamos aqu es el que se corresponde con la clase Persona.
Despus de la cabecera XML DOCTYPE, entramos en la parte de descripcin de los
emparejamientos, delimitada por el elemento <hibernate-mapping>. Este elemento
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="hibernateholamundo.Persona" table="personas">
<id name="id" column="id" type="int">
<generator class="increment"/>
</id>

<property name="nombre" column="nombre" type="string"/>
</class>

</hibernate-mapping>
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 19

Curso: "Java EE y Frameworks" 2013

permite especificar, mediante atributos, diversas caractersticas como el esquema de la
base de datos.
Como estamos emparejando una clase con una tabla, hemos de especificar cules son.
Lo hacemos usando el elemento <class>
Indicamos el nombre de la clase (hibernateholamundo.Persona) y el nombre de
la tabla con la que se empareja (table=personas).
Una vez emparejados objeto y tabla, hay que emparejar las propiedades del objeto con
las columnas de la tabla. En nuestro ejemplo, observamos que para describir este
emparejamiento se utilizan dos elementos XML distintos: <id> y <property>.
El primero, <id>, empareja una de las propiedades con la clave primaria de la tabla
Identificamos la propiedad que se empareja con la clave primaria mediante el
atributo XML name. En nuestro caso, la propiedad a relacionar con la clave
primaria es id. Esta propiedad se empareja con la columna ID de la tabla:
column=ID. Como el nombre de la propiedad y el de la columna coinciden, en
este caso, nos podramos ahorrar el atributo column.
Tambin, y opcionalmente, especificamos el tipo de datos con el que estamos
trabajando. En este caso, con enteros. Como es un tipo bsico, no
necesitaramos usar el atributo type. Hibernate sabe deducir el tipo de datos
que estamos utilizando a partir de la introspeccin. Hibernate analiza en tiempo
de ejecucin las clases Java y obtiene la informacin que necesita. Aqu, a guisa
de ejemplo, especificamos el tipo de datos Hibernate: type=integer o int
El subelemento <generator> nos permite definir cmo se generan los valores de
las claves primarias. Hibernate nos ofrece diversos mtodos de generacin de
valores para las claves primarias. El mtodo se especifica mediante el atributo
class. En nuestro ejemplo, usamos el increment que genera identificadores de
tipo long, short o int que son nicos slo cuando no hay otro proceso que est
insertando datos en la misma tabla
El mtodo identity, se utiliza cuando trabajamos con claves primarias de tipo
IDENTITY (auto-increment).
El mtodo native es bastante interesante. Deja que Hibernate escoja entre los
mtodos identity, sequence o hilo,7 en funcin de las caractersticas del gestor
de bases de datos con el que trabajemos
El elemento <property> sirve para emparejar aquellas propiedades que no forman parte
de la clave primaria con las correspondientes columnas de una (o ms) tablas.
Como en el caso del elemento id, el atributo name indica el nombre de la
propiedad, el atributo column, el nombre de la columna de la tabla personas y
el atributo type nos indica el tipo de Hibernate. El atributo unique, opcional, nos
permite especificar si se admiten valores duplicados o no. En nuestro caso, no.
El atributo opcional not-null, nos permite especificar la obligacin de que la
propiedad tenga un valor no nulo.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 20

Curso: "Java EE y Frameworks" 2013

4. Crear el archivo de Configuracin de Hibernate para la Conexin y el DataSource (hibernate.cfg)
El archivo Hibernate configuration es uno por cada aplicacin. Aqu se especifica la
informacin de configuracin de conexin de base de datos junto con los nombres de
los archivos de mapeo (*.hbm.xml) que creamos recientemente.
Clic derecho sobre el proyecto HibernateHolaMundo y Seleccionar New-> XML
Document
Para el nombre del archivo (File Name), ingresamos hibernate.cfg
Clic Browse en el campo Folder.

Seleccionamos la carpeta src.
Clic Select Folder.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 21

Curso: "Java EE y Frameworks" 2013


Clic Next
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 22

Curso: "Java EE y Frameworks" 2013


Clic Finish

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 23

Curso: "Java EE y Frameworks" 2013

Reemplazar el contenido generado por el IDE (en el archivo XML hibernate.cfg.xml) con
el contenido que sigue a continuacin:
<?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>
<!-- Configuracin de conexin a la Base de Datos -->
<property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="connection.url">jdbc:derby://localhost:1527/ejemplo_hibernate</property>
<property name="connection.username">curso</property>
<property name="connection.password">javaee</property>

<!-- JDBC connection pool -->
<property name="connection.pool_size">1</property>

<!-- SQL dialecto -->
<property name="dialect">org.hibernate.dialect.DerbyDialect</property>

<!-- Mostrar en consola todos las sentencias SQL ejecutadas -->
<property name="show_sql">false</property>

<!-- Archivos Mapping -->
<mapping resource="Persona.hbm.xml"/>
</session-factory>
</hibernate-configuration>

5. Crear la Clase HibernateUtil
Es una clase de utilidad de hibernate que nos permite conectarnos a la base de datos
mediante Hibernate y adems tendr otras funciones para testing y debugging que nos
permitir crear las tablas de la base de datos y mostrar los datos ingresados por
hibrnate, no es tan importante saber cmo funciona internamente, solo la utilizamos
para el ejemplo y desarrollo con hibernate.
Clic derecho sobre el proyecto HibernateHolaMundo y Seleccionar New-> Java Class
Para el nombre de la clase (Class Name ), ingresamos HibernateUtil
Para el campo Package, ingresamos hibernateholamundo
Clic Finish
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 24

Curso: "Java EE y Frameworks" 2013


Modificamos la clase HibernateUtil tal como se muestra en el cdigo de abajo
package hibernateholamundo;
import java.sql.*;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 25

Curso: "Java EE y Frameworks" 2013

// Database configuration
public static String url = "jdbc:derby://localhost:1527/ejemplo_hibernate";
public static String dbdriver = "org.apache.derby.jdbc.ClientDriver";
public static String username = "curso";
public static String password = "javaee";
static Connection conn;
static Statement st;

public static void setup(String sql) {
try {
createStatement();
st.executeUpdate(sql);
} catch (Exception e) {
System.err.println("Got an exception! ");
e.printStackTrace();
System.exit(0);
}
}

public static void createStatement() {
try {
Class.forName(dbdriver);
conn = DriverManager.getConnection(url, username, password);
st = conn.createStatement();
} catch (Exception e) {
System.err.println("Got an exception! ");
e.printStackTrace();
System.exit(0);
}
}

// Drop table if exists
public static void droptable(String sql) {
try {
createStatement();
st.executeUpdate(sql);
} catch (Exception e) {
}
}

public static void checkData(String sql) {
String[] starray = sql.split(" ");
System.out.println("\n******** Table: " + starray[starray.length - 1] + " *******");
try {
createStatement();
ResultSet r = st.executeQuery(sql);
HibernateUtil.outputResultSet(r);
} catch (Exception e) {
e.printStackTrace();
}
}

public static void outputResultSet(ResultSet rs) throws Exception {
ResultSetMetaData metadata = rs.getMetaData();

int numcols = metadata.getColumnCount();
String[] labels = new String[numcols];
int[] colwidths = new int[numcols];
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 26

Curso: "Java EE y Frameworks" 2013

int[] colpos = new int[numcols];
int linewidth;

linewidth = 1;
for (int i = 0; i < numcols; i++) {
colpos[i] = linewidth;
labels[i] = metadata.getColumnLabel(i + 1); // get its label
int size = metadata.getColumnDisplaySize(i + 1);
if (size > 30 || size == -1) {
size = 30;
}
int labelsize = labels[i].length();
if (labelsize > size) {
size = labelsize;
}
colwidths[i] = size + 1; // save the column the size
linewidth += colwidths[i] + 2; // increment total size
}

StringBuffer divider = new StringBuffer(linewidth);
StringBuffer blankline = new StringBuffer(linewidth);
for (int i = 0; i < linewidth; i++) {
divider.insert(i, '-');
blankline.insert(i, " ");
}
// Put special marks in the divider line at the column positions
for (int i = 0; i < numcols; i++) {
divider.setCharAt(colpos[i] - 1, '+');
}
divider.setCharAt(linewidth - 1, '+');

// Begin the table output with a divider line
System.out.println(divider);

// The next line of the table contains the column labels.
// Begin with a blank line, and put the column names and column
// divider characters "|" into it. overwrite() is defined below.
StringBuffer line = new StringBuffer(blankline.toString());
line.setCharAt(0, '|');
for (int i = 0; i < numcols; i++) {
int pos = colpos[i] + 1 + (colwidths[i] - labels[i].length()) / 2;
overwrite(line, pos, labels[i]);
overwrite(line, colpos[i] + colwidths[i], " |");
}
System.out.println(line);
System.out.println(divider);

while (rs.next()) {
line = new StringBuffer(blankline.toString());
line.setCharAt(0, '|');
for (int i = 0; i < numcols; i++) {
Object value = rs.getObject(i + 1);
if (value != null) {
overwrite(line, colpos[i] + 1, value.toString().trim());
overwrite(line, colpos[i] + colwidths[i], " |");
}
}
System.out.println(line);
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 27

Curso: "Java EE y Frameworks" 2013

}
System.out.println(divider);
}

static void overwrite(StringBuffer b, int pos, String s) {
int len = s.length();
for (int i = 0; i < len; i++) {
b.setCharAt(pos + i, s.charAt(i));
}
}
}


Configuration: es el objeto que contiene la informacin necesaria para conectarse a la base
de datos. Es el encargado de leerse el archivo XML de configuracin de Hibernate
hibernate.cfg.xml.
Tambin es el encargado de procesar la informacin correspondiente a los
aparejamientos. Es el encargado de leerse y verificar los archivos de
emparejamiento nombreDeClasse.hbm.xml.
Configuration conf = new Configuration();
SessionFactory: es una fbrica de Sessions. Un objeto Configuration es capaz de crear una
SessionFactory ya que tiene toda la informacin necesaria.
Normalmente, una aplicacin slo tiene una SessionFactory.
SessionFactory sessionFactory = conf.buildSessionFactory()
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 28

Curso: "Java EE y Frameworks" 2013

6. Agregamos las libreras de Hibernate y Derby.
Clic derecho sobre el proyecto HibernateHolaMundo y Seleccionar Properties

Seleccionamos Libraries bajo Categories (seccin izquierda) y seleccionamos el botn
Add Library (seccin derecha)
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 29

Curso: "Java EE y Frameworks" 2013


Seleccionar Hibernate library.
Clic en botn Add Library

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 30

Curso: "Java EE y Frameworks" 2013

Hora descargamos el archivo driver derbyclient.rar que est disponiblr como archivo de
descarga de la semana.
Lo descomprimimos en la carpeta \curso\javaee\hibernate o alguna otra de
preferencia.
Y ahora agregamos el driver Derby(Java DB driver) al proyecto

Clic en botn Add JAR/Folder
Seleccionar el archivo derbyclient.jar en la ubicacin que seleccionamos anteriormente.
Clic en Abrir.

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 31

Curso: "Java EE y Frameworks" 2013


Clic OK.

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 32

Curso: "Java EE y Frameworks" 2013

7. Modificamos la clase Main.java creada anteriormente.
Modificar Main.java generado por el IDE como se muestra en el cdigo de abajo.
Estudiar el cdigo prestando especial atencin a las partes en negrita y azul.
package hibernateholamundo;

import org.hibernate.*;

public class Main {

public static void main(String[] args) {

// Creamos la tabla persona
HibernateUtil.droptable("drop table personas");
HibernateUtil.setup("create table personas ( id int, nombre VARCHAR(30))");

// Creamos el SessionFactory y el objeto de Session hibernate
SessionFactory sessions = HibernateUtil.getSessionFactory();
Session session = sessions.openSession();

// Comienza el ciclo de vida de las operaciones hibernate bajo una transaccin
Transaction tx = null;
try {
tx = session.beginTransaction();

// Creamos a una Persona y la guardamos
Persona p1 = new Persona();
p1.setNombre("Andrs Guzmn");
session.save(p1);

// Creamos a otro objeto Persona y lo guardamos.
Persona p2 = new Persona();
p2.setNombre("James Gosling");
session.save(p2);

// Recibe el objeto persona
Persona persona = (Persona) session.get(Persona.class, p1.getId());
System.out.println("Primera persona recibida = " + persona.getNombre());
persona = (Persona) session.get(Persona.class, p2.getId());
System.out.println("Primera persona recibida = " + persona.getNombre());

tx.commit();
tx = null;
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}

// Mostramos los datos guardados
HibernateUtil.checkData("select * from personas");
}
}
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 33

Curso: "Java EE y Frameworks" 2013

Session: La principal interface entre la aplicacin Java e Hibernate. Es la que mantiene
las conversaciones entre la aplicacin y la base de datos. Permite aadir, modificar y
borrar objetos en la base de datos.
Session session = sessionFactory.openSession()
Transaction: Como su nombre indica, se encarga de la transaccionalidad. Permite definir
unidades de trabajo.
Transaction tx = session.beginTransaction();
[...]session.save(objeto);
tx.commit();
[...]
tx.rollback();

8. Ahora estamos listos para ejecutar la aplicacin con Run
Clic derecho sobre el proyecto HibernateHolaMundo y seleccionar Run


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 34

Curso: "Java EE y Frameworks" 2013

Observe el resultado en la ventana de consola (Output) del Netbeans IDE







AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 35

Curso: "Java EE y Frameworks" 2013

Solucin de problemas 1: Si aparece el siguiente error en la ventana de la Consola (Output), esto se
debe a que la base de dato no ha sido iniciada o levantada.
ADVERTENCIA: Could not obtain connection metadata
java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error al conectarse al servidor localhost en el
puerto 1527 con el mensaje Connection refused: connect.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
at org.apache.derby.jdbc.ClientDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:154)
at
org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at hibernateholamundo.HibernateUtil.buildSessionFactory(HibernateUtil.java:19)
at hibernateholamundo.HibernateUtil.<clinit>(HibernateUtil.java:14)
at hibernateholamundo.Main.main(Main.java:14)
Caused by: org.apache.derby.client.am.DisconnectException: java.net.ConnectException : Error al conectarse al servidor
localhost en el puerto 1527 con el mensaje Connection refused: connect.
at org.apache.derby.client.net.NetAgent.<init>(Unknown Source)
at org.apache.derby.client.net.NetConnection.newAgent_(Unknown Source)
at org.apache.derby.client.am.Connection.<init>(Unknown Source)
at org.apache.derby.client.net.NetConnection.<init>(Unknown Source)
at org.apache.derby.client.net.NetConnection40.<init>(Unknown Source)
at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl40.newNetConnection(Unknown Source)
... 10 more
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:525)
at java.net.Socket.connect(Socket.java:475)
at java.net.Socket.<init>(Socket.java:372)
at java.net.Socket.<init>(Socket.java:186)
at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:206)
at org.apache.derby.client.net.OpenSocketAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 16 more


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 36

Curso: "Java EE y Frameworks" 2013

Solucin de problemas 2: Si aparece el siguiente error en la ventana de la Consola (Output), esto se
debe a que el drivers cliente derbyclient.jar de la base de datos Derby, no se ha agregado al proyecto
(library classpath)
GRAVE: JDBC Driver class not found: org.apache.derby.jdbc.ClientDriver
java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:61)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at hibernateholamundo.HibernateUtil.buildSessionFactory(HibernateUtil.java:19)
at hibernateholamundo.HibernateUtil.<clinit>(HibernateUtil.java:14)
at hibernateholamundo.Main.main(Main.java:14)
Initial SessionFactory creation failed.org.hibernate.HibernateException: JDBC Driver class not found:
org.apache.derby.jdbc.ClientDriver
Exception in thread main java.lang.ExceptionInInitializerError
at hibernateholamundo.HibernateUtil.buildSessionFactory(HibernateUtil.java:23)
at hibernateholamundo.HibernateUtil.<clinit>(HibernateUtil.java:14)
at hibernateholamundo.Main.main(Main.java:14)
Caused by: org.hibernate.HibernateException: JDBC Driver class not found: org.apache.derby.jdbc.ClientDriver
at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:66)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at hibernateholamundo.HibernateUtil.buildSessionFactory(HibernateUtil.java:19)
2 more
Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:61)
9 more

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 37

Curso: "Java EE y Frameworks" 2013


9. Verificar los registros en la base de datos
En este paso, vamos a ver si la tabla contiene a los dos registros que se agregaron en el
ejercicio anterior en la clase Main.
Seleccionar la pestaa Services (seccin izquierda del IDE).
Expandir Databases.
Clic derecho en "jdbc:derby://localhost:1527/ejemplo_hibernate [curso on CURSO]" y
seleccionar Connect (si an no se encuentra conectada).

Expandir CURSO->Tables.
Clic derecho en la tabla PERSONAS y seleccionar View Data
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 38

Curso: "Java EE y Frameworks" 2013


Observamos que aparecen los dos registros agregados en la tabla PERSONAS.


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 39

Curso: "Java EE y Frameworks" 2013

Ejercicio 3: Construir una aplicacin HibernateHolaMundo2" con
Hibernate

1. Crear el Proyecto HibernateHolaMundo2 copiando el proyecto HibernateHolaMundo
2. Clic derecho sobre el proyecto HibernateHolaMundo y seleccionar Copy


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 40

Curso: "Java EE y Frameworks" 2013

3. Dar un nombre al nuevo proyecto
Observe que aparece la ventana Copy Project .
Para el nombre del proyecto (Project Name), ingresamos HibernateHolaMundo2
Clic Copy

Observamos que el proyecto HibernateHolaMundo2 es creado y aparece en la pestaa
Proyects.

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 41

Curso: "Java EE y Frameworks" 2013

4. Agregamos una nueva clase de dominio: el POJO Estudiante
Creamos la clase POJO Estudiante.java
package hibernateholamundo;

import java.io.Serializable;

public class Estudiante implements Serializable {
private int id;
private String colegio;
private String grado;

protected Estudiante() {
}

public Estudiante(int id, String colegio) {
this.id = id;
this.colegio = colegio;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getColegio() {
return colegio;
}

public void setColegio(String colegio) {
this.colegio = colegio;
}

public String getGrado() {
return grado;
}

public void setGrado(String grado) {
this.grado = grado;
}
}


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 42

Curso: "Java EE y Frameworks" 2013

5. Creamos el nuevo archivo mapping Estudiante.hbm.xml para la clase Estudiante
Creamos Estudiante.hbm.xml misma ubicacin que el mapping de Persona.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="hibernateholamundo.Estudiante" table="estudiantes">
<id name="id" type="int">
<generator class="increment"/>
</id>

<property name="colegio" column="nombre_colegio" type="string"/>
<property name="grado" column="grado" type="string"/>
</class>
</hibernate-mapping>

6. Ahora modificamos la clase Main.java en el proyecto HibernateHolaMundo2, el cdigo
agregado estn en negrita y de color azul, asegurarse de estar modificando la clase Main.java
del proyecto HibernateHolaMundo2 y NO del proyecto HibernateHolaMundo (Es muy fcil
cometer este error)

AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 43

Curso: "Java EE y Frameworks" 2013

package hibernateholamundo;

import org.hibernate.*;

public class Main {

public static void main(String[] args) {

// Creamos la tabla persona
HibernateUtil.droptable("drop table personas");
HibernateUtil.droptable("drop table estudiantes");
HibernateUtil.setup("create table personas ( id int, nombre VARCHAR(30))");
HibernateUtil.setup("create table estudiantes ( id int, nombre_colegio VARCHAR(30), grado VARCHAR(20))");

// Creamos el SessionFactory y el objeto de Session hibernate
SessionFactory sessions = HibernateUtil.getSessionFactory();
Session session = sessions.openSession();

// Comienza el ciclo de vida de las operaciones hibernate bajo una transaccin
Transaction tx = null;
try {
tx = session.beginTransaction();

// Creamos a una Persona y la guardamos
Persona p1 = new Persona();
p1.setNombre("Andrs Guzmn");
session.save(p1);

// Creamos a otro objeto Persona y lo guardamos.
Persona p2 = new Persona();
p2.setNombre("James Gosling");
session.save(p2);

// Recibe el objeto persona
Persona persona = (Persona) session.get(Persona.class, p1.getId());
System.out.println("Primera persona recibida = " + persona.getNombre());
persona = (Persona) session.get(Persona.class, p2.getId());
System.out.println("Primera persona recibida = " + persona.getNombre());

// Creamos a la objeto Estudiante y lo guardamos
Estudiante s1 = new Estudiante();
s1.setColegio("Colegio Camino la Montaa");
s1.setGrado("1 Bsico");
session.save(s1);

// Recibe el objeto Estudiante
Estudiante student = (Estudiante)session. get(Estudiante.class, s1.getId());
System.out.println("Primer estudiante recibido = " + student.getId() + ", " +
"Colegio = " + student.getColegio() + ", " +
"Grado = " + student.getGrado());

tx.commit();
tx = null;
} catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 44

Curso: "Java EE y Frameworks" 2013

} finally {
session.close();
}
// Mostramos los datos guardados
HibernateUtil.checkData("select * from personas");
HibernateUtil.checkData("select * from estudiantes");
}
}

7. Modificamos el archivo hibernate.cfg.xml, el cdigo agregado estn en negrita y de color azul.
<?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>
<!-- Configuracin de conexin a la Base de Datos -->
<property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="connection.url">jdbc:derby://localhost:1527/ejemplo_hibernate</property>
<property name="connection.username">curso</property>
<property name="connection.password">javaee</property>

<!-- JDBC connection pool -->
<property name="connection.pool_size">1</property>

<!-- SQL dialecto -->
<property name="dialect">org.hibernate.dialect.DerbyDialect</property>

<!-- Mostrar en consola todos las sentencias SQL ejecutadas -->
<property name="show_sql">false</property>

<!-- Archivos Mapping -->
<mapping resource="Persona.hbm.xml"/>
<mapping resource="Estudiante.hbm.xml"/>
</session-factory>
</hibernate-configuration>


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 45

Curso: "Java EE y Frameworks" 2013

8. Ejecutar el proyecto HibernateHolaMundo2
Clic Derecho sobre el proyecto HibernateHolaMundo2 y seleccionar Run.
Observe el resultado desplegado en la consola (Pestaa Output)


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 46

Curso: "Java EE y Frameworks" 2013

9. Observar en la Consola las sentencias SQL
Modificaremos la bandera (flag) en el hibernate.cfg.xml para mostrar las sentencias SQL
que son enviadas por Hibernate (Muy til para testing y debugging)
Cambiar la propiedad "show_sql" a true en el element <session-factory> dentro del
archivo hibernate.cfg.xml


AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 47

Curso: "Java EE y Frameworks" 2013

1. Ejecutar el proyecto HibernateHolaMundo2
Clic Derecho sobre el proyecto HibernateHolaMundo2 y seleccionar Run.
Observe las sentencias SQL enviadas por Hibernate en consola (Pestaa Output)




AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 48

Curso: "Java EE y Frameworks" 2013

Resumen
En este workshop, hemos visto cmo crear un proyecto de Hibernate desde cero y adems crear otro
proyecto Hibernate a partir de uno existente. Tambin vimos cmo agregar una nueva clase POJO y su
archivo de mapeo Hibernate correspondiente. Finalmente aprendimos a mostrar los comandos SQL que
se envan por Hibernate a la base de datos.




Enva tus consultas a los foros!
Aqu es cuando debes sacarte todas las dudas
haciendo consultas en los foros
correspondientes
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Hibernate ORM 49