2. I. Introducción
Durante el desarrollo de una aplicación suelen estar involucradas dos entidades
diferentes: el código que mueve la aplicación y los datos que se manejan. Ambas
entidades han evolucionado de manera diferente, y el acceso a los datos desde los
programas se ha vuelto una tarea en ocasiones, complicada. Los sistemas de
Mapeo ObjetoRelacional ayudan a combatir esta complicación.
En el siguiente informe presentamos lo que son las ORM y la utilización que tienen,
tanto sus ventajas como desventajas, dentro del aspecto de la programación
(aplicación en sí). Así como existen diferentes aplicativos para realizar la
“comunicación” entre nuestra aplicación con nuestra base de datos, también
llamados frameworks.
Se realiza una demostración ejemplo, de un modelo basado en la cantidad de
trabajadores que realizan algún tipo de proyecto, cuyos empleados pertenecen a
cierto departamento. Con este aplicativo, se realiza la consulta de los datos que
existen, todo esto a través del framework a utilizar (en este caso Hibernate), a
través de la base de datos que otorga postgresql.
3. II. Objetivos
2.1 Objetivos Generales:
● Desarrollar a través de un ejemplo práctico, la aplicación del concepto de Mapeo
objeto relacional (ORM), mediante la utilización de distintas herramientas
tecnológicas libres (software), que permitan el desarrollo íntegro del proyecto.
2.2 Objetivos Específicos:
● Estudiar el concepto Mapeo Objeto Relacional (ORM)
● Diseñar un mini proyecto que permita aplicar el concepto ORM
● Utilizar la herramienta Hibernate, para aplicar el proyecto.
● Realizar el mapeo mediante archivo XML
4.
III. Desarrollo
3.1 ¿Qué es la persistencia de objeto?
La persistencia de objetos es la capacidad que tienen los objetos de sobrevivir al
proceso que los creó; permitiendo al programador almacenar, transferir y recuperar
su estado.
3.2 ¿Qué es ORM?
Es un modelo de programación el cual consiste en la transformación de las tablas
de una base de datos, en una serie de entidades que logren simplificar las tareas
básicas de acceso a los datos para el programador.
Antes de la aparición de los sistemas ORM, las consultas se tenían que realizar a
mano dentro de las propias aplicaciones, así la ventaja de los lenguajes orientados
a objetos se perdía, ya que había que crear una petición a la base de datos de
manera manual. Además esta petición debe ser específica para cada sistema, ya
que no todos los gestores de bases de datos tienen la misma implementación del
lenguaje SQL.
Ejemplo: Limitar el número de registro de una consulta.
SELECT TOP 10 * FROM usuarios //SqlServer
SELECT * FROM usuarios LIMIT 10 //MySQL
SELECT * FROM usuarios WHERE rownum<=20; //Oracle
Esto supone un problema para el programador, que tendrá que aprender acerca del
lenguaje de base de datos, y si desea migrar la aplicación a otra, tendrá que
reescribir un gran número de consultas.
Por lo tanto ORM es: La persistencia automatizada y transparente de las tablas en
una Base de Datos relacional, usando metadatos (datos que describen a otros
datos) que definen el mapeo entre los objetos y la Base de Datos.
6. 3.4 Herramientas ORM
Existen múltiples herramientas para realizar esta persistencia de datos, para el
lenguaje java por ejemplo encontramos algunas tales como: Hibernate, iBatis,
Ebean, etc.
En el trabajo propuesto se utilizó la herramienta Hibernate. Algunas de sus
características son las siguientes:
No tiene adquisición o cuotas de mantenimiento.
Se integra perfectamente con otros frameworks.
Fácil de aprender y usar.
Flexible: Se puede utilizar con o sin Ejes, a nivel de empresa o aplicaciones
Java.
Es de código abierto.
3.5 Estructura de Hibernate
Para trabajar con Hibernate, hay que definir cómo se trabajará si se usará POJOs
(clases) o no, definir donde se encontrará el archivo de configuración; creación de
la base de datos, definición de las clases persistentes y no persistentes; definición
del mapeo registroobjeto; definir los métodos de acceso a datos y de persistencia
de los datos; programar los métodos y probarlos.
3.5.1 Archivos a utilizar.
Se tiene dos tipos de archivos (propios de Hibernate).
Los tipos de archivos de configuración: Determina todo aspecto relacionado con la
base de datos (conexión, por ejemplo).
Y los archivos que definirán el mapeo.
3.5.1.1 Archivos de configuración
El archivo de configuración (hibernate.cfg.xml) está constituido principalmente por:
Nombre de la propiedad Uso
7. hibernate.connection.driver_class Controlador clase JDBC
hibernate.connection.url JDBC URL
hibernate.connection.username Nombre del usuario de la base de datos
hibernate.connection.password Contraseña para acceder a la base de
datos.
hibernate.connection.pool_size Número máximo de un grupo de
conexiones.
También encontramos otras que son opcionales, pero que fue utilizada en el desarrollo
del proyecto:
Nombre de la propiedad Uso
hibernate.dialect Permite a Hibernate generar SQL
optimizado para una determinada base de
datos relacional.
A continuación se presentan los diferentes dialectos que existen en hibernate:
9. 3.5.1.2 Archivos de mapeos
Hibernate usa metadatos de mapeo para saber como cargar y almacenar objetos de la
clase persistente. Y tienes ciertas etiquetas que se identificarán a continuación.
<hibernatemapping>
Elemento raíz que contiene todos los elementos de la clase.
<class>
Los elementos de esta clase, son usados para definir específicos mapeos de la clase de
java a la tabla de base datos.
Ejemplo:
<class name="Event" table="EVENTS">
...
</class>
● El atributo name, es el nombre de la clase que se quiere definir como entidad.
● El atributo table, es el nombre de la base de datos que contiene los datos para
esta entidad.
<meta>
Este elemento es opcional y puede ser usado para crear descripción de clases.
Ejemplo:
<meta attribute="classdescription">
This class contains the employee detail.
</meta>
<id>
Este elemento contiene la ID única en la clase para la clave primaria de la base de datos
Ejemplo:
<id name="id" type="int" column="id">
10. …</id>
● El atributo name, del elemento id, se refiere a la propiedad de la tabla.
● El atributo column, se refiere a la columna en la tabla de base datos.
● El atributo type, tiene el tipo de mapeo para hibernate, este tipo de mapeo se
convertirá de Java a un tipo de datos SQL.
<generator>
Se utiliza para generar valores automáticamente en la clave principal.
Ejemplo:
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
En el ejemplo anterior, el elemento generador esta en “native”, para dejar que hibernate
elija cualquier identidad, ya sea secuencia o algoritmo de hilo para crear la clave primaria
dependiendo de la base de datos. También encontramos Assigned, sequence, entre
muchas más.
<property>
Se usa para asignar una propiedad de clase Java a una columna de la base de datos.
Ejemplo:
<property name="firstName" column="first_name" type="string"/>
<property name="lastName" column="last_name" type="string"/>
<property name="salary" column="salary" type="int"/>
● El atributo name, como siempre hace referencia a la propiedad de la clase.
● El atributo column, se refiere a la columna en la tabla de base datos.
● El atributo type, tiene el tipo de mapeo para hibernate, este tipo de mapeo se
convertirá de Java a un tipo de datos SQL
El mapeo final del archivo ejemplo employee.hbm.xml quedaría de la siguiente forma:
12. Se genera una sola tabla, donde se guardan todas las instancias de la herencia.
Esta tabla tiene una columna para cada una de las propiedades de cada una de
las clases que forman la jerarquía.
Para saber a qué clase concreta pertenece una fila de esta tabla se usa un valor
en una columna discriminadora. Esta columna discriminadora, es importante
debido a que sabremos qué clase pertenece cada una de las filas de nuestra
tabla. El valor contenido puede ser cualquiera que nosotros indiquemos para cada
una de nuestras entidades.
❖ Tabla por subclase:
Cada una de las clases y subclases que declaren atributos persistentes,
incluyendo clases abstractas e interfaces, tendrán su propia tabla. Cada tabla
tiene solamente, las columnas que representan los atributos declarados en la
clase, junto con una columna para la llave primaria que es también una llave
foránea de la superclase.
❖ Tabla por clase concreta :
En este caso se genera una tabla por cada una de las entidades noabstractas
que tenga nuestra aplicación. Sin embargo, cada tabla tendrá una columna para
cada uno de los atributos de la clase de la entidad que almacena, tanto atributos
propios como heredados.
3.6 Aplicativo
Para la realización del proyecto a desarrollar, se utilizaron las siguientes herramientas:
Datamodeler.
PostgreSQL
Eclipse.
Jboss: Servidor de aplicaciones java EE
Y por supuesto, Hibernate.
13. 3.6.1 Modelo relacional
Figura n°3: Modelo relacional de la base de datos.
3.6.2 Descripción de las entidades.
Empleado: Entidad que tiene toda la información de los empleados.
Atributo Tipo Descripción Restricción
ID_Empleados integer Se almacena el id del
empleado
Clave Primaria
No nulo
Nombre varchar Se almacena el
nombre del empleado
No nulo.
Apellido varchar Se almacena el
apellido del empleado
No nulo.
Dirección varchar Se almacena la
dirección del
empleado.
Departamento_numero_departament
o
integer Foránea de la tabla
departamento
Clave Foránea.
No nulo.
Ingeniero: Entidad que tiene la información de los empleados que son ingenieros.
Atributo Tipo Descripción Restricción
14. ID integer Se almacena el id del
ingeniero
Clave Primaria
No nulo
Área varchar Se almacena el área
en que traba el
ingeniero
No nulo.
Secretaria: Entidad que tiene la información de los empleados que son Secretaria.
Atributo Tipo Descripción Restricción
ID integer Se almacena el id de
secretaria
Clave Primaria
No nulo
Software varchar Software que utiliza
secretaria
No nulo.
velocidad_de_tipeo varchar Almacena la velocidad
de tipeo de Secretaria
No nulo.
TecnicoProgramador: Entidad que tiene la información de los empleados que son
técnicos programadores.
Atributo Tipo Descripción Restricción
ID integer Se almacena el id del
técnico programador
Clave Primaria
No nulo
Lenguaje_favorito varchar Se almacena el
lenguaje preferido del
técnico programador.
No nulo.
Departamento: Entidad donde se tiene la información de los departamentos.
Atributo Tipo Descripción Restricción
numero_departamento integer Se almacena el id de
departamento
Clave Primaria
No nulo
Nombre varchar Almacena el nombre
del departamento.
No nulo.
Ubicación varchar Se almacena la
información de la
ubicación del
departamento.
No nulo.
15. Proyectos: Entidad que se refiere a la información de los proyectos que se realizan.
Atributo Tipo Descripción Restricción
ID_Proyectos integer Se almacena el id de
Proyecto
Clave Primaria
No nulo
Nombre varchar Almacena el nombre
del proyecto.
No nulo.
Descripción varchar Almacena la
descripción del
proyecto.
Trabaja_en: Entidad que se encuentra en relación con Empleados y Proyectos.
Atributo Tipo Descripción Restricción
empleados_id integer Foránea para la tabla
Empleado.
Clave Foránea
No nulo
proyectos_id integer Foránea para la tabla
Proyectos.
Clave Foránea
No nulo
Horas varchar Se almacena las horas
de trabajo del
proyecto.
No nulo.
16. 3.6.3 Creación de la base de datos.
Para crear la base de datos propuesta, se utilizó postgresql. A continuación los códigos
SQL para la creación del modelo ya mostrado (Figura N°3).
17.
3.6.4 Creación de las clases.
Se utilizó el IDE eclipse para el desarrollo del aplicativo en cuestión, se instala Hibernate
como un plugin para trabajar con él.
Lo primero que se hizo, luego de la creación de la base de datos y la configuración del
IDE con hibernate, fue crear las clases del aplicativo utilizando POJO.
POJO, es una simple clase de Java. Significa: Plain Old Java Object, que contiene
métodos get y set para cada uno de los atributos. En cada clase POJO, se declararon las
entidades de la base de datos, ya antes mostrado, con sus respectivos get y set.
3.6.5 Archivos XML
Mapeo Empleado Departamento
Como se observó en el modelo relacional, la relación entre Empleado y Departamento,
en la cual un empleado pertenece a un departamento y un departamento tiene muchos
empleados, aquí se realizó un mapeo objeto relacional unidireccional en la cual solo
Empleado sabe de la relación con Departamento, no asi departamento quien no sabe de
la relación con empleado, por lo que se hizo un mapeo de muchos a uno.
El mapeo realizado por Hibernate se explica a continuación.
21. 1. HQL(Hibernate Query Language), es un híbrido entre Sql y Orientación Objeto,
permite consultas CRUD(Create, Read,Update, Delete).
2. Criteria API, Orientado Puramente a orientación a objeto, solamente permite
Operaciones de selección.
3. Native SQL , es un lenguaje Orientado Totalmente a SQL, permite CRUD, la
4. SQL nombradas, es un lenguaje orientado a Sql , su declaración debe ser en el
archivo de mapeo, su uso es para situaciones en la cual se requieren muchas
instrucciones sql de un solo tipo.
Declaración y Acceso de Consultas en Hibernate:
HQL: dentro del identificador createQuery se ingresa la consulta SQL, pero se debe tener
cuidado, debido a que no acepta el identificador * , por lo que es necesario crear un alias.
El identificador setLong, permite modificar un valor dinámicamente, en este ejemplo se
observa el valor 0 que representa al primer símbolo “?” que se encuentra, una vez
realizada la consulta de obtiene la query en una lista.
Criteria API
Para la utilización de esta técnica es necesario declarar que es de tipo Criteria , con el
método createCriteria,dentro de esta como atributos se define la clase a la cual se hará
referencia, el método add, restrictions , nos permiten acotar la búsqueda, existen muchos
métodos que se pueden conjugar con Restrictions, luego el método eq realiza una
comparación del “atributo”, y algún valor obtenido, finalmente se obtiene el resultado en
una lista.
Native SQL
Orientado totalmente a SQL se necesita declarar el método createSQLQuery, para
indicar que se utilizara este método,como argumentos recibe la consulta SQL y addEntity
hace referencia a la clase que se utilizará.
24. V. Bibliografía
❏ Chapter 2. Tutorial Using Native Hibernate APIs andhbm.xml Mappings.
Recuperado de:
https://docs.jboss.org/hibernate/orm/3.6/quickstart/enUS/html/hibernategsgtutori
albasic.html
❏ Hibernate Tutorial. Recuperado de:
http://www.tutorialspoint.com/hibernate/index.htm
❏ Chapter 3. Configuration. Recuperado de:
https://docs.jboss.org/hibernate/orm/3.3/reference/enUS/html/sessionconfiguratio
n.html
❏ Capítulo 9: Mapeo de Herencias. Recuperado de:
https://docs.jboss.org/hibernate/orm/3.5/reference/esES/html/inheritance.html
❏ Generator classes in Hibernate. Recuperado de:
http://www.javatpoint.com/generatorclasses
VI. Anexos