Está en la página 1de 17

Antes de empezar necesitars:

Instalar NetBeans IDE. Al momento de escribir esto, anda dando vueltas la versin 6.8 RC2. Instalar MySQL o Java DB, o tener acceso a conectarte a una de estas bases de datos con permiso para acceder o crear la base de datos Sakila. La base de datos Sakila est disponible en estos dos tipos de bases de datos, pero Hibernate funciona con cualquier JDBC, por ejemplo PostgreSQL y Oracle. Importar la base de datos de ejemplo Sakila (a la que le haremos consultas en este ejemplo). Una vez obtenido esto, asegrate de configurar NetBeans IDE para poder acceder a la base de datos Sakila desde el panel "Prestaciones" (Men Ventana > Prestaciones. Instalar el complemento de Hibernate El plug-in, si no lo tienes ya instalado, lo obtienes

1. yendo, en el men, a Herramientas > Complementos. 2. En la ficha Plugins disponibles, selecciona la casilla del mduloHibernate y presiona Instalar. 3. Siguiente 4. Acepta los trminos de todos los contratos de licencia y presiona el botn de Instalar. 5. Despus que se descargue y se instale, presiona Terminar. 6. Y listo, el mdulo para Hibernate (o Hibernar) se activar solo; o sino, reinicia NetBeans IDE.

Crear Proyecto nuevo


Primero: lo tpico. Creamos un Proyecto nuevo de tipo Aplicacin web. Para nuestro ejemplo, le damos el nombre DVDStore. Elegimos un servidor como Tomcat o Glassfish, Siguiente y marcamos la opcin Hibernate y seleccionamos la base de datosjdbc:mysql://localhost:3306/sakila, en nuestro caso, de la lista que, supongo, ya habas configurado anteriormente como indiqu en los pasos previos de este tutorial.
Terminar

Fjate que en:


o

DVDStore Libraries

se agregaron automticamente las libreras necesarias para utilizarHibernate y conectar a la base de datos.

Configurar proyecto
hibernate.cfg.xml Abre el archivo hibernate.cfg.xml que est en la ruta:
o

DVDStore Source Packages <paquete predeterminado> hibernate.cfg.xml

Una vez abierto en NetBeans IDE, en el modo Diseo, en la partePropiedades opcionales, Propiedades de configuracin, ponAgregar... y aade la propiedad:

Nombre de la propiedad: hibernate.show_sql Valor de la propiedad: true


Dentro de las mismas Propiedades opcionales del modo Diseo deNetBeans IDE, ms abajo, en Propiedades varias, Agrega la propiedad: Nombre de la propiedad: hibernate.current_session_context_class Valor de la propiedad: thread Despus de esto, si ves el archivo hibernate.cfg.xml en el modo Operador XML, quedara un cdigo ms o menos as, pero con otras contraseas, por supuesto:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernateconfiguration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">######</property> <property name="hibernate.current_session_context_class">thread</property> <property name="hibernate.show_sql">true</property> </session-factory> </hibernate-configuration>

Guarda los cambios del archivo. Asistente de ingeniera inversa de Hibernate Agreguemos un nuevo archivo, ingeniera inversa de Hibernate y seleccionemos Hibernar >Asistente de

En el siguiente paso dejamos los valores por defecto (asegurndonos que pertenezca al proyecto DVDStore). Siguiente. Se cargarn automticamente los nombres de las tablas de la base de datos Sakila (elegida cuando creamos el proyecto), y seleccionaremos las tablas:

actor category film film_actor film_category language


Para pasar tablas de una columnas a la otra, existen los botones Agregar > y < Eliminar.

Si marcas la casilla Incluir tablas relacionadas algunas otras tablas se incluirn automticamente. Eso est bien. Al presionar Terminar se va a crear un archivohibernate.reveng.xml parecido a este:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernatereverse-engineering-3.0.dtd"> <hibernate-reverse-engineering> <schema-selection match-catalog="sakila"/> <table-filter match-name="film"/> <table-filter match-name="language"/>

<table-filter match-name="category"/> <table-filter match-name="actor"/> <table-filter match-name="film_category"/> <table-filter match-name="film_actor"/> </hibernate-reverse-engineering>

No lo edites, cerralo. Archivos de mapas de Hibernate y POJOs de la base de datos Crea un Archivo nuevo.... Categora Hibernar, de Hibernate y POJOs de la base de datos. tipo Archivos de mapas

Debes ponerle nombre a la clase donde estarn los mapas de Hibernate. Para que este tutorial funcione, ponle dvdrental ...y presiona el botn Terminar. Se deberan generar los siguientes archivos:
o

DVDStore Source Packages dvdrental Actor.hbm.xml Actor.java Category.hbm.xml Category.java Film.hbm.xml Film.java FilmActor.hbm.xml FilmActor.java FilmActorId.java FilmCategory.hbm.xml FilmCategory.java FilmCategoryId.java Language.hbm.xml Language.java

HibernateUtil.java Lo ltimo sera crear TipoHibernateUtil.java. un Archivo Nuevo..., Categora Hibernar,

Terminar

Empecemos
FilmHelper.java Crea una nueva Clase Java (Archivo Nuevo..., Categora Java, tipoClase Java) y llmale FilmHelper y ponlo dentro del paquetedvdrental.
Terminar

Agrega el siguiente cdigo (en negrita) para crear una sesin deHibernate.
package dvdrental; public class FilmHelper { Session session = null; public FilmHelper() { this.session = HibernateUtil.getSessionFactory().getCurrentSession(); } }

Van a aparecer unos errores que se arreglan usando el men contextual (botn secundario del ratn) y eligiendo la opcin Reparar importaciones.
La opcin Reparar importaciones en ingls se llama Fix import.

Si dejamos el valor por defecto, quedara el cdigo deFilmHelper.java de la siguiente manera:


package dvdrental; import org.hibernate.Session; public class FilmHelper { Session session = null; public FilmHelper() { this.session = HibernateUtil.getSessionFactory().getCurrentSession(); } }

Consultas HQL

Probemos algo. Haz click con el botn secundario sobre el archivoSource Packages/<paquete predeterminado>/hibernate.cfg.xml y selecciona la opcin Ejecutar la consulta HQL del men contextual. En la barra de herramientas del editor de consultas HQL, selecciona la Sesin: hibernate.cfg y escribe lo siguiente en la primera caja de texto grande:
from Film

Y presiona el botn que est al lado de la lista desplegable que debera estar mostrando hibernate.cfg como opcin seleccionada para hacer la consulta y obtener un resultado como el siguiente. Ahora prueba con una consulta un poquito ms complicada:
from Film as film where film.filmId between 100 and 200

Con las consultas probadas, obteniendo los resultados esperados, podemos utilizarlas en la clase helper.

Hibernate
Edita el archivo FilmHelper.java y agrgale el siguiente mtodo (marcado con negrita):
package dvdrental; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; public class FilmHelper { Session session = null; public FilmHelper() { this.session = HibernateUtil.getSessionFactory().getCurrentSession(); } // Obtiene los films donde el id de film est entre un cierto rango especificado por las variables startID y endID public List getFilmTitles(int startID, int endID) { List<Film> filmList = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Film as film where film.filmId between '" + startID + "' and '" + endID + "'"); filmList = (List<Film>) q.list();

} catch (Exception e) { e.printStackTrace(); } return filmList; } }

Repara las importaciones (Fix Import) si es necesario, utilizando las clases de hibernate. para que quede completamente igual como est en el cdigo de ejemplo anterior. Vuelve a abrir el Editor de Consultas HQL y haz la siguiente query:
from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='10')

Esta consulta obtiene los actores de la pelcula del filmid = 10. Ahora smale el siguiente archivoFilmHelper.java:
package dvdrental; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; public class FilmHelper { Session session = null; public FilmHelper() { this.session = HibernateUtil.getSessionFactory().getCurrentSession(); } // Obtiene los films donde el id de film est entre un cierto rango especificado por las variables startID y endID public List getFilmTitles(int startID, int endID) { List<Film> filmList = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Film as film where film.filmId between '" + startID + "' and '" + endID + "'"); filmList = (List<Film>) q.list(); } catch (Exception e) { e.printStackTrace(); } return filmList; }

mtodo

(marcado

con

negrita)

al

// Obtiene los actores en un film particular public List getActorsByID(int filmId) { List<Actor> actorList = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='" + filmId + "')"); actorList = (List<Actor>) q.list(); } catch (Exception e) { e.printStackTrace(); } return actorList; } }

Repara las importaciones si es necesario. Guarda. Ahora agrega 3 mtodos ms y algunos mtodos que invent para hacer uso de beans en el cdigo JSPX.
package dvdrental; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; public class FilmHelper { Session session = null; public FilmHelper() { this.session = HibernateUtil.getSessionFactory().getCurrentSession(); } // Obtiene los films donde el id de film est entre un cierto rango especificado por las variables startID y endID public List getFilmTitles(int startID, int endID) { List<Film> filmList = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Film as film where film.filmId between '" + startID + "' and '" + endID + "'"); filmList = (List<Film>) q.list(); } catch (Exception e) { e.printStackTrace(); } return filmList; }

// Obtiene los actores en un film particular public List getActorsByID(int filmId) { List<Actor> actorList = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='" + filmId + "')"); actorList = (List<Actor>) q.list(); } catch (Exception e) { e.printStackTrace(); } return actorList; } // Obtiene una lista de categoras de acuerdo al filmId public Category getCategoryByID(int filmId) { List<Category> categoryList = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Category as category where category.categoryId in (select filmCat.category.categoryId from FilmCategory as filmCat where filmCat.film.filmId='" + filmId + "')"); categoryList = (List<Category>) q.list(); } catch (Exception e) { e.printStackTrace(); } return categoryList.get(0); } // Obtiene un solo film de acuerdo al filmId public Film getFilmByID(int filmId) { Film film = null; try { org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Film as film where film.filmId=" + filmId); film = (Film) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); } return film; } // Obtiene el idioma del film de acuerdo a un langId public String getLangByID(int langId) { Language language = null;

try{ org.hibernate.Transaction tx = session.beginTransaction(); Query q = session.createQuery("from Language as lang where lang.languageId=" + langId); language = (Language) q.uniqueResult(); } catch (Exception e) { e.printStackTrace(); } return language.getName(); }

//Mtodos para no poner cdigo java en el JSPX int startId; int endId; int filmId; int langId; public void setAttributeStartID(int startId){ this.startId = startId; } public void setAttributeEndID(int endId){ this.endId = endId; } public List getFilmTitlesList(){ return getFilmTitles(startId,endId); } public void setAttributeFilmByID(int filmId){ this.filmId = filmId; } public List getActorsID() { return getActorsByID(filmId); } public Category getCategoryID() { return getCategoryByID(filmId); } public Film getFilmID() { return getFilmByID(filmId); } public void setAttributeLangByID(int langId){ this.langId = langId; } public String getLangID() { return getLangByID(langId); } }

JSP(X)
Hurra. Por fin llegamos a las pginas web. A mi me gusta escribir las JSPcon JSTL as que antes de seguir debers...

Instalar la librera JSTL 1. Entra a las propiedades del proyecto sobre DVDStore, opcin Propiedades). (botn secundario del ratn

2. En la seccin Libraries hay un botn Add Library.... Presinalo. 3. Si no te aparece inmediatamente, Importa la librera (o biblioteca tambin le llaman) JSTL 1.1 o superior. 4. Selecciona la librera JSTL y adela al proyecto. 5. Aceptar Nuevo archivo JSPX Primero elimina el archivo index.jsp del carpeta DVDStore/Web Pages/ del proyecto. proyecto que est en la

Agrega un nuevo archivo JSPX y cambia la pgina por defecto. En el archivo index.jspx escribe lo siguiente.
index.jspx <?xml version="1.0" encoding="UTF-8"?> <!-Document : index Created on : 01-dic-2009, 21:43:16 Author : ooscarr --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> <jsp:output omit-xml-declaration="no" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-root-element="html"/> <jsp:directive.page import="dvdrental.*"/> <jsp:directive.page import="java.util.List"/> <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>DVDStore</title> </head> <body>

<c:set <c:set <c:set <c:set

var="startID" value="1"/> var="endID" value="10"/> var="prev_startID" value="1"/> var="prev_endID" value="10"/>

<c:set var="FILM_RECORD_COUNT" value="1000"/> <c:set var="RECORD_START_PAGE" value="false"/> <c:set var="RECORD_END_PAGE" value="false"/> <c:if test="${not empty param.startid}"> <c:set var="startID" value="${param.startid}"/> </c:if> <c:if test="${not empty param.endid}"> <c:set var="endID" value="${param.endid}"/> </c:if> <jsp:useBean id="helper" class="dvdrental.FilmHelper"/> <!-- Invento para pasar filmID a FilmHelper.java --> <c:set target="${helper}" property="attributeStartID" value="${startID}"/> <c:set target="${helper}" property="attributeEndID" value="${endID}"/> <c:set var="filmTitles" value="${helper.filmTitlesList}"/> <c:if test="${startID == 1}"> <c:set var="RECORD_START_PAGE" value="true"/> </c:if> <c:if test="${endID == FILM_RECORD_COUNT}"> <c:set var="RECORD_END_PAGE" value="true"/> </c:if> <c:set var="prev_startID" value="${startID-10}"/> <c:set var="prev_endID" value="${endID-10}"/> <c:set var="startID" value="${endID+1}"/> <c:set var="endID" value="${endID+10}"/> <c:set var="filmTitlesSize" value="${fn:length(filmTitles)}"/> <table> <thead> <c:choose> <c:when test="${RECORD_START_PAGE}"> <tr> <td class="NEXT"> </td> <td class="NEXT"> </td> <td class="NEXT"> </td> <td class="NEXT"> <a class="NEXT" href="index.jspx?startid=${startID}&amp;endid=${endID}">Next</a></td> </tr> </c:when> <c:when test="${RECORD_END_PAGE}"> <tr> <td class="NEXT"> </td>

<td class="NEXT"> </td> <td class="NEXT"> <a class="NEXT" href="index.jspx?startid=${prev_startID}&amp;endid=${prev_endID}">Prev</a></t d> <td class="NEXT"> </td> </tr> </c:when> <c:otherwise> <tr> <td class="NEXT"> </td> <td class="NEXT"> </td> <td class="NEXT"> <a class="NEXT" href="index.jspx?startid=${prev_startID}&amp;endid=${prev_endID}">Prev</a></t d> <td class="NEXT"> <a class="NEXT" href="index.jspx?startid=${startID}&amp;endid=${endID}">Next</a> </td> </tr> </c:otherwise> </c:choose> <tr><th>Title</th><th>Description</th><th> </th><th> </th></tr> </thead> <tbody> <c:forEach items="${filmTitles}" var="i"> <c:set var="film" value="${i}"/> <c:set var="filmID" value="${film.filmId}"/> <tr> <td class="COL1"> <a href="browse.jspx?id=${filmID}">${film.title}</a> </td> <td class="COL2">${film.description}</td> <td class="COL2"> <a href="browse.jspx?id=${filmID}">More</a> </td> <td class="COL2"> <a href="rent.jsp?id=${filmID}">Rent</a> </td> </tr> </c:forEach> </tbody> </table> </body> </html> </jsp:root>

Ya lo puedes hacer correr si quieres probarlo.

Si no te gusta escribir las JSP con JSTL, puedes revisar el cdigo oficial donde est lo mismo pero en clave Java clsico. browse.jspx Crea otro archivo JSP con sintaxis XML que se llame browse con el siguiente cdigo:
<?xml version="1.0" encoding="UTF-8"?> <!-Document : browse Created on : 29-nov-2009, 19:47:16 Author : ooscarr --> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0" xmlns:c="http://java.sun.com/jsp/jstl/core"> <jsp:output omit-xml-declaration="no" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-root-element="html"/> <jsp:directive.page import="dvdrental.*"/> <jsp:directive.page import="java.util.List"/> <jsp:directive.page contentType="text/html" pageEncoding="UTF-8"/> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>DVDStore browse</title> </head> <body> <!-- Get title ID --> <c:set var="filmID" value="1"/> <c:if test="${not empty param.id}"> <c:set var="filmID" value="${param.id}"/> </c:if> <c:set var="startPage">false</c:set> <c:set var="endPage">false</c:set> <jsp:useBean id="helper" class="dvdrental.FilmHelper"/> <!-- Invento para pasar filmID a FilmHelper.java --> <c:set target="${helper}" property="attributeFilmByID" value="${filmID}"/> <jsp:useBean id="film" class="dvdrental.Film"/> <c:set var="film" value="${helper.filmID}"/> <c:set var="filmTitle" value="${film.title}"/> <c:set var="filmDescription" value="${film.description}"/>

<!-- Get Actors --> <c:set var="actors" value="${helper.actorsID}"/> <!-- Get Category --> <c:set var="category" value="${helper.categoryID}"/> <c:set var="totalCast"> <c:forEach items="${actors}" var="i">${i.firstName} ${i.lastName}, </c:forEach> </c:set> <!-- Invento para pasar langId a FilmHelper.java --> <c:set target="${helper}" property="attributeLangByID" value="${film.languageByLanguageId.languageId}"/> <!-- Obtiene el idioma usando el langId entregado anteriormente --> <c:set var="language" value="${helper.langID}"/> <c:set var="filmLength" value="${film.length}"/> <c:set var="filmRating" value="${film.rating}"/> <c:set var="filmYear" value="${film.releaseYear}"/> <c:set var="rentalDuration" value="${film.rentalDuration}"/> <c:set var="rentalRate" value="${film.rentalRate}"/> <c:set var="specialFeatures" value="${film.specialFeatures}"/> <table> <tr> <td class="RENT"> </td> <td class="RENT"> <a class="RENT" href="browse.jspx?id=${filmID}">Arrendar</a> </td> </tr> <tr> <th class="TITLE">Ttulo</th> <td class="TITLE">${filmTitle}</td> </tr> <tr> <th class="COL1">Descripcin</th> <td class="COL2">${filmDescription}</td> </tr> <tr> <td class="COL1"> </td> <td class="COL2"> </td> </tr> <tr> <th class="COL1">Gnero</th> <td class="COL2">${catName}</td> </tr> <tr> <td class="COL1"> </td> <td class="COL2"> </td> </tr> <tr> <th class="COL1">Reparto</th> <td class="COL2">${totalCast}</td>

</tr> <tr> <td class="COL1"> </td> <td class="COL2"> </td> </tr> <tr> <th class="COL1">Duracin de la pelcula</th> <td class="COL2">${filmLength} <abbr title="minutos">mins.</abbr></td> </tr> <tr> <th class="COL1">Idioma</th> <td class="COL2">${language}</td> </tr> <tr> <th class="COL1">Calificacin cinematogrfica</th> <td class="COL2">${filmRating}</td> </tr> <tr> <th class="COL1">Ao</th> <td class="COL2">${filmYear}</td> </tr> <tr> <td class="COL1"> </td> <td class="COL2"> </td> </tr> <tr> <th class="COL1">Caractersticas especiales</th> <td class="SPECIAL">${specialFeatures}</td> </tr> <tr> <td class="COL1"> </td> <td class="COL2"> </td> </tr> <tr> <th class="COL1">Precio Arriendo</th> <td class="COL2">US$ ${rentalRate}</td> </tr> <tr> <th class="COL1">Duracin de Arriendo</th> <td class="COL2">${rentalDuration} das</td> </tr> </table> </body> </html> </jsp:root>

Ejecuta la aplicacin en el servidor, visita la pgina (en mi mquina se est ejecutando en http://localhost:8084/DVDStore/) y Voil!. Funciona o te equivocaste.

Conclusiones

A pesar de que este ejemplo slo hace lecturas a la base de datos, me puedo imaginar que escribir debe ser igual de sencillo ya que autmticamente se generan la clases bean para insertar valores (set). Con la persistencia ya no me tengo que preocupar de hacer la conexin y desconexin en cada pgina, la contrasea est guardada de manera ms segura y estandarizada, y el acceso a las tablas se hace sencillo manejndolas como clases (un editor de Java ayuda a completar el cdigo) y no andan las consultas SQL dando vueltas por todo el cdigo, lo que ofrece mayor abstraccin entre los distintos niveles del cdigo otorgando flexibilidad a cambios. Si se me ocurre cambiar la base de datos (agregar una columna, modificar el nombre de una tabla o las relaciones y tipos de datos), habra que regenerar los mapas de Hibernate y volver a compilar todo. Tambin, si nos fijamos en todo lo que hay que saber sobre programacin Java, se hace ms difcil la programacin, aunque supongo y reconozco que con el tiempo se debe volver ms sencillo con la experiencia. Obvio. Mejoras en el rendimiento... No s. Supongo que al tener todas las consultas guardadas... Y con Hibernate preocupado de las conexiones y desconexiones... Me imagino que s hay alguna mejora, lo desconozco

También podría gustarte