WebSec Hibernate
WebSec Hibernate
Referencia: https://netbeans.org/kb/docs/web/hibernate-webapp.html
Introducción.
En este ejemplo se utiliza el IDE de NetBeans para crear y desplegar una aplicación Java Swing que muestra datos de una
base de datos. La aplicación utiliza el Framework Hibernate como capa de persistencia para recuperar POJOs (Plain Old
Java Objects) desde una base de datos relacional.
Hibernate es un ambiente que proporciona herramientas para el mapeo relacional de objetos (ORM). Aquí se muestra el
soporte Hibernate incluido en el IDE y cómo utilizar asistentes para crear los archivos necesarios de Hibernate. Después
de crear los objetos Java y configurar la aplicación para utilizar Hibernate, se crea una interfaz gráfica de usuario para la
búsqueda y visualización de los datos.
Este ejemplo es una aplicación web para la administración de una tienda de DVD, e incluye cómo crear una aplicación que
permita consultar el perfil de un actor basándose en la coincidencia del nombre o el apellido. Se puede extender la aplicación
para consultar los detalles de la película y añadir, actualizar o eliminar elementos. Se utiliza MySQL y la base de datos
sakila, pero se puede usar cualquier otro servidor de base de datos soportado con las aplicaciones de Hibernate.
Desarrollo.
1. Crear la Base de Datos.
En este ejercicio se usa la base de datos sakila de MySQL. La base de datos no se incluye al instalar el IDE y se necesita
crear primero la base de datos.
La base de datos sakila es una base de datos MySQL gratuita disponible desde el sitio de MySQL. Para crear la base de
datos sakila se descarga e instala el plugin de sakila utilizando el administrador de plugins. Después de instalar el plugin
se puede crear la base de datos sakila desde la ventana Services. La base de datos sakila se agrega a la lista de bases de
datos en el cuadro de diálogo Create MySQL Database.
1. Abrir el administrador de Plugins e instalar el plugin de Sakila Sample Database.
4. Seleccionar la base de datos sakila de la lista desplegable New Database Name del cuadro de diálogo Create
MySQL Database. Clic en OK.
Al digitar clic en OK, el nodo sakila se muestra bajo el nodo del servidor MySQL.
5. Digitar clic derecho en el nodo sakila y seleccione Connect. Se crea un nodo de conexión de base de datos para
sakila (jdbc:mysql://localhost:3306/sakila [username on Default]) y se muestra bajo el
nodo Databases. Cuando se abre una conexión, al expandir el nodo de conexión se muestran los datos en la base
de datos.
Digitando en Finish, se crea el proyecto en el IDE. El proyecto no tiene una clase principal. Se creará un formulario y luego
la clase principal.
El IDE incluye asistentes para crear los archivos de Hibernate que necesita el proyecto. Si se crea el archivo de configuración
de Hibernate con un asistente del IDE, se agregan automáticamente las bibliotecas Hibernate al proyecto.
3. Conservar la configuración predeterminada en la sección Name and Location (se desea crear el archivo en la carpeta
src). Clic en Next.
4. Seleccionar la conexión sakila en la lista desplegable Database Connection. Database Dialect no se modifica. Clic
en Finish.
Si expande el nodo Libraries en la ventana Projects se puede ver que el IDE agrega los archivos JAR de Hibernate
necesarios y el conector JAR de MySQL.
Nota. El IDE NetBeans 8.0 incluye las bibliotecas Hibernate 4. Las versiones anteriores del IDE incluyen Hibernate 3.
Si se digita clic en la pestaña Source en el editor se puede ver el archivo en vista XML. El archivo debe ser similar al
siguiente:
<hibernate-configuration>
<session-factory name="session1">
<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.show_sql">true</property>
Después de crear la forma y configurarla como la clase principal se podrá ver la consulta SQL en la ventana de salida del
IDE cuando se ejecute el proyecto.
En esta sección se utiliza el asistente New File para crear la clase HibernateUtil.java de ayuda.
1. Clic derecho en el nodo Source Packages y seleccionar New > Other para abrir el asistente New File.
2. Seleccionar Hibernate de la lista Categories y HibernateUtil.java de la lista File Types. Clic en Next.
3. Ingresar HibernateUtil en el nombre de clase y sakila.util en el nombre del paquete. Clic Finish.
Se puede utilizar el asistente de ingeniería inversa y los archivos de mapeo Hibernate y POJOs de un asistente de base de
datos para crear múltiples POJOs y archivos de mapeo basados en tablas de bases de datos que se seleccionen.
Alternativamente, se pueden utilizar los asistentes del IDE para ayudar a crear los POJOs individuales y los archivos de
asignación a partir de cero.
NOTA MUY IMPORTANTE: Cuando se desea crear archivos de varias tablas, lo deseable es utilizar los asistentes. Aquí
solamente sólo es necesario crear un POJO y un archivo de mapeo, por lo que basta crear los archivos de forma individual.
Como se indica a continuación.
Nota. Esta sección puede ser optativa, pero se utiliza para la creación individual de los archivos POJO y de mapeo que se
crean con el asistente de la base de datos para los archivos de mapeo de Hiberante y POJOs.
1. Clic derecho en el nodo Source Packages en la ventana Projects y seleccionar New > Java Class para abrir el
asistente New Java Class.
Después de crear el POJO para la tabla, se crea el archivo de Mapeo Hibernate para Actor.java.
1. Clic derecho en el nodo de paquetes fuente sakila.entity en la ventana Projects y seleccionar New > Other para
abrir el asistente New File.
Al digitar clic en Finish el archivo de mapeo Actor.hbm.xml de Hibernate se abre en el editor. El IDE también agrega
automáticamente una entrada para el recurso de mapeo al hibernate.cfg.xml. Se pueden ver los detalles de la entrada
expandiendo el nodo Mapping en la vista Design del hibernate.cfg.xml o en la vista XML. La entrada mapping en la
vista XML es similar a lo siguiente:
<mapping resource="sakila/entity/Actor.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. Mapear los campos de Actor.java a las columnas de la tabla ACTOR realizando los siguientes cambios (en negritas)
al Actor.hbm.xml.
<hibernate-mapping>
Nota: Se puede utilizar la finalización de código en el editor para completar los valores al modificar el archivo de mapeo.
De forma predeterminada, el elemento generado class tiene una etiqueta de cierre. Debido a la necesidad de agregar
elementos de propiedades entre las etiquetas de apertura y cierre de class, es necesario realizar los siguientes cambios (en
negrita). Después de realizar los cambios se puede utilizar la finalización de código entre las etiquetas class.
<hibernate-mapping>
<class name="sakila.entity.Actor" table="actor">
</class>
</hibernate-mapping>
2. Seleccionar Hibernate de la lista Categories y Hibernate Reverse Engineering Wizard de la lista File Types.
Clic en Next.
El asistente genera el archivo hibernate.reveng.xml de ingeniería inversa. Cerrar el archivo de ingeniería inversa, ya que
no se necesitará editar el archivo.
Creación de los Archivos de Mapeo de Hibernate y POJOs Desde una Base de Datos.
2. Seleccionar Hibernate Mapping Files and POJOs from Database en la categoría Hibernate. Clic en Next.
Al digitar clic en Finish, el IDE genera el POJO Actor.java con todos los campos necesarios y genera un archivo de mapeo
Hibernate y añade la entrada de mapeo a hibernate.cfg.xml.
Ahora, ya se tiene el POJO y los archivos Hibernate relacionados necesarios para crear la interface gráfica GUI de Java para
la aplicación. También, se creará y agregará una consulta HQL que consulta la base de datos para recuperar los datos. En
este proceso también se utiliza el editor HQL para construir y probar la consulta.
Al finalizar, el IDE crea la clase y abre el formulario JFrame en la vista Design del editor.
Ahora, se posee un formulario para crear el código y asignar eventos a los componentes del formulario. Enseguida, se
construyen las consultas basadas en Hibernate Query Language para recuperar datos. Después de construir las consultas
se agregan los métodos la formulario para invocar la consulta apropiada cuando se digite el botón de consulta.
4. Probar la conexión escribiendo from Actor en el HQL Query Editor. Clic en el botón Run HQL Query en
la barra de herramientas. Al digitar sobre Run HQL Query se deben mostrar los resultados de la consulta en el
panel inferior del HQL Query Editor.
La consulta regresa una lista de los atributos de aquellos actores cuyos nombres inician con 'PE'.
Si se digita el botón SQL, ubicado arriba de los resultados, debe mostrarse la siguiente consulta SQL equivalente:
select actor0_.actor_id as col_0_0_ from sakila.actor actor0_
where (actor0_.first_name like ‘PE%’)
6. Abrir una nueva pestaña del HQL Query Editor e ingresar la siguiente consulta en el panel del editor. Clic en Run
HQL Query:
from Actor a where a.lastName like ‘MO%’
La consulta regresa una lista con los detalles de los actores cuyos apellidos inician con 'MO'.
3. Agregar los siguientes métodos para crear la consulta basadas en la cadena de entrada del usuario.
private void runQueryBasedOnFirstName() {
executeHQLQuery(QUERY_BASED_ON_FIRST_NAME + firstNameTextField.getText() + "%'");
}
Los métodos invocan al método executeHQLQuery () y crean la consulta combinando la cadena de consulta con la
cadena de búsqueda introducida por el usuario.
El método executeHQLQuery() invoca a Hibernate para ejecutar la consulta seleccionada . Este método utiliza la clase
de utilería HibernateUtil.java para obtener la Hibernate Session.
5. Digitar clic derecho en el editor y seleccione Fix Imports que genera los enunciados imports para las bibliotecas
Hibernate (org.hibernate.Query , org.hibernate.Session) y java.util.List. Guardar los
cambios.
6. Crear el controlador de eventos del botón Query cambiando a la vista Design y digitar doble clic en el botón
Query.
for(Object o : resultList) {
Actor actor = (Actor)o;
Vector<Object> oneRow = new Vector<Object>();
oneRow.add(actor.getActorId());
oneRow.add(actor.getFirstName());
oneRow.add(actor.getLastName());
oneRow.add(actor.getLastUpdate());
tableData.add(oneRow);
}
resultTable.setModel(new DefaultTableModel(tableData, tableHeaders));
}
9. Digitar clic derecho en el editor y seleccionar Fix Imports para generar los enunciados imports de
java.util.Vector y java.util.List. Guardar los cambios.
Nota: En este caso la clase List es una estructura de datos y no un componente del AWT, que también posee un
componente gráfico tipo List.
8. Ejecutar el Proyecto.
Ahora que la codificación está completa, se ejecuta la aplicación. Antes de ejecutar el proyecto, se especifica la clase
principal de la aplicación en el cuadro de diálogo de propiedades del proyecto. Si no se especifica la clase principal, se
solicitará que se configure la primera vez que se ejecute la aplicación.
1. Digitar clic derecho en el nodo del proyecto en la ventana Projects y seleccionar Properties.
2. Seleccionar la categoría Run en el cuadro de diálogo Project Properties.
3. Ingresar sakila.ui.DVDStoreAdmin en la clase principal. Digitar clic en OK.
A la izquierda se muestra el árbol de archivos completo. Ingresar una cadena de búsqueda en el campo de texto First Name
o Last Name y digitar clic en Query para buscar un actor y ver los detalles, como se indica enseguida:
En la ventana de salida del IDE se muestra la consulta SQL que recupera los resultados mostrados.
EJERCICIO: Actualizar los imports y plugins necesarios para que la aplicación completa se ejecute
adecuadamente.
1. Agregar un captcha, ID y contraseña para ingresar a la aplicación.
2. Agregar un campo de comentarios para atacar vía SQL Injection y XSS Scripting.
Probar la actualización del ejercicio e instalarlo en un servidor Web para probar su correcta ejecución. Utilizar el
DBMS MySQL para la base de datos en el servidor Web. Generar un reporte completo con detalles e imágenes de
la aplicación.