Orm final

24
Contenido I. Introducción II. Objetivos III. Desarrollo 3.1 ¿Qué es la persistencia de objeto? 3.2 ¿Qué es ORM? 3.3 Ventajas y Desventajas de ORM 3.4 Herramientas ORM 3.5 Estructura de Hibernate 3.5.1 Archivos a utilizar. 3.5.1.1 Archivos de configuración 3.5.1.2 Archivos de mapeos 3.6 Base de datos a implementar con ORM 3.6.1 Modelo relacional 3.6.2 Descripción de las entidades. 3.6.3 Creación de la base de datos. 3.6.4 Creación de las clases. 3.6.5 Archivos XML 3.6.8 Main. IV. Conclusión V. Bibliografía VI. Anexos

Transcript of Orm final

Page 1: Orm final

Contenido

I. Introducción II. Objetivos III. Desarrollo

3.1 ¿Qué es la persistencia de objeto? 3.2 ¿Qué es ORM? 3.3 Ventajas y Desventajas de ORM 3.4 Herramientas ORM 3.5 Estructura de Hibernate 3.5.1 Archivos a utilizar.

3.5.1.1 Archivos de configuración 3.5.1.2 Archivos de mapeos

3.6 Base de datos a implementar con ORM 3.6.1 Modelo relacional 3.6.2 Descripción de las entidades. 3.6.3 Creación de la base de datos. 3.6.4 Creación de las clases. 3.6.5 Archivos XML 3.6.8 Main.

IV. Conclusión V. Bibliografía VI. Anexos

Page 2: Orm final

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 Objeto­Relacional 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.

Page 3: Orm final

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

Page 4: Orm final

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.

Page 5: Orm final

Es decir que la aplicación en sí utiliza frameworks, ya que se utiliza una técnica en donde se ligan las bases de datos y los conceptos de orientación a objetos creando ”bases de datos virtuales”.

Figura n°1: Mapeo objeto relacional

Una solución ORM esta formada por cuatro partes: 1. Una API que posibilite la realización de operaciones de creación, actualización y borrado sobre objetos de clases persistentes. 2. Un lenguaje o API para poder especificar consultas sobre dichas clases. 3. Una opción para especificar mapeo de metadatos. 4. Una técnica para que la implementación del ORM pueda llevar a cabo búsquedas, asociaciones u otras funciones de optimización.

3.3 Ventajas y Desventajas de ORM

Ventajas

Facilidad y velocidad de uso Abstracción de la base de datos usada. Seguridad de la capa de acceso a datos contra ataques.

Desventajas

En entornos con gran carga poner una capa más en el proceso puede mermar el rendimiento.

Aprender el nuevo lenguaje del ORM.

Page 6: Orm final

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 registro­objeto; 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

Page 7: Orm final

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:

Page 8: Orm final

Finalmente, el archivo hibernate.cfg.xml, quedaría como el ejemplo que se anuncia a continuación:

<property name="hibernate.connection.driver_class">org.postgresql.Driver</property> <property name="hibernate.connection.password">clave</property> <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgress</property> <property name="hibernate.connection.username">postgres</property> <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> <mapping resource="hibernate.hbm.xml"/>

Page 9: Orm final

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. <hibernate­mapping> 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="class­description"> 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">

Page 10: Orm final

…</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:

Page 11: Orm final

Figura n°2: Mapeo de la clase Employee a la tabla Employee y sus propiedades 3.5.1.2.1 Relaciones. Las siguientes, son las etiquetas que logran hacer la asociación de las clases entre las entidades y las tablas de ORM. Un mapeo de asociación puede ser bidireccional o unidireccional.

Tipo de mapeo Descripción.

many­to­one Mapea la relación mucho a uno

one­to­one Mapea la relación uno a uno

one­to­many Mapea la relación uno a mucho

many­to­many Mapea la relación muchos a muchos.

Cuando se dice unidireccional, se refiere a que la relación será sólo en un sentido y bidireccional en ambos sentidos. 3.5.1.2.2 Herencia. Para reflejar la herencia de de una base datos y poder persistir las clases heredadas, también cuenta con sus propias etiquetas, de las cuales Hibernate da tres opciones a elegir según las necesidades de la aplicación.

Tabla por jerarquía de clases:

Page 12: Orm final

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 no­abstractas 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.

Page 13: Orm final

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_departamento

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

Page 14: Orm final

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.

Page 15: Orm final

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.

Page 16: Orm final

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).

Page 17: Orm final

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 plug­in 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.

Page 18: Orm final

ondiente nombre en la base de datos empleados, luego su id en la clase con su tipo de datos, la columna en la tabla de la base d

Figura n°4: Archivo Employee.hbm.xml Con la etiqueta del elemento class con el nombre de la clase Employee y su correspondiente id, luego se genera un número de secuencia para evitar conflicto de duplicación de clave primaria, luego las propiedades de la clase Employee (sus atributos) que se verá reflejado en la base de datos después de realizar el mapeado y Finalmente la etiqueta many to one con el nombre de la clase a la cual se esta asociando a Empleados que en este caso es Departamento y la columna que la asocia que es en este caso Departamento_num_depto con la propiedad no nula. A continuación la configuración del XML de Departamento que solo tiene el nombre de la clase su id, su generador y sus propiedades ya que no sabe de la relación con Empleados.

Page 19: Orm final

Figura n°5: Archivo Departamento.hbm.xml Mapeo Empleado ­ Proyecto De antemano se crea la base de datos, es decir se crearon cada una de las tablas correspondientes a cada entidad incluyendo la tabla que se crea por la relación entre empleados y proyecto (tabla trabajan_en). Como se observó en el modelo relacional, la relación entre Empleado y Proyecto es que un empleado puede trabajar en muchos proyectos y un proyecto puede tener asociado muchos empleados, aquí se realizó un mapeo objeto relacional unidireccional en la cual solo Proyecto sabe de la relación con Empleados, no asi empleado quien no es “conciente” de la relación con proyecto, por lo que se hizo un mapeo esta de muchos a muchos por lo que Hibernate crea automáticamente la tabla unión trabajan_en, la desventaja de esta opción es que no es posible llenar el atributo horas que se encuentra en la tabla trabajan_en. Se hizo un mapeo muchos a muchos como se puede observar en la siguiente figura número 6.

Figura n°6: Archivo Proyectos.hbm.xml El archivo XML correspondiente a Empleados es el mostrado en la figura número 4 ya que empleados no sabe de la relación con proyectos ya que es unidireccional.

Page 20: Orm final

Mapeo Empleado ­ TecnicoProgramador

Figura n°7: Segunda parte del Archivo Employee.hbm.xml donde se observa el mapeo de

la herencia

Figura n°8: Archivo de configuración TecnicoProgramador.hbm.xml

3.6.8 Consultas. Hibernate proporciona 4 métodos para poder realizar consultas sobre las bases de datos, estas consultas Tipos de Consultas Hibernate: Hibernate permite 4 tipos de consultas, las cuales todas primero se ejecutan sobre la capa virtual de hibernate y luego se traducen a lenguaje SQL, algunos métodos requieren menos trabajo de conversión debido a la forma en la cual permite trabajar, a continuación se presentan los métodos de consultas:

Page 21: Orm final

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á.

Page 22: Orm final

SQL Nombradas Para esta técnica es necesario escribir dentro del archivo de mapeo XML la sentencia <sql­query name=”nombre de la consulta”> y el valor de retorno con la sentencia return, luego de esto se escribe la consulta SQL, para luego finalizar con el cierre de la etiqueta inicial.

Para invocar esta consulta se necesita escribir la última sentencia de la imagen, haciendo referencia con el método getNameQuery(“nombre de consulta”).

IV. Conclusión La técnica de programación de mapeo objeto relacional (ORM), es esencial en los tiempos actuales debido a que la mayoría de los lenguajes de programación poseen un paradigma orientado a objeto, además entrega el soporte necesario para poder utilizar la persistencia de datos, en base de datos relacionales, las cuales ocupan un gran campo en el mercado actual y tiene el soporte necesario para muchos lenguajes.

Hibernate, una herramienta ORM con licencia de software libre, creada en base al lenguaje de programación Java, se ha patentado en el negocio de la programación a lo largo de los años dentro de los primeros lugares, entregando la flexibilidad necesaria para realizar persistencia de programas orientados a objetos, esto a través de una capa virtual que se posiciona sobre la BD relacional, además Hibernate plantea una estructura que permite la rigurosidad necesaria para diseñar programas altamente funcionales, sin limitar el procesamiento de datos.

A pesar de los inconvenientes con el mapeo mediante el archivo XML creemos que con hibernate si la base de datos ya esta creada y se tiene un ORM no nos haría falta tener un modelo en adelante de las uniones de las tablas, bastaría con conocer que objetos deberíamos invocar y apartir de ahi trabajar sobre la base de datos por lo que se llega a

Page 23: Orm final

la independencia de los distintos SQL , por lo que no tendríamos que pensar en el SQL de Mysql o el SQL de Oracle por ejemplo, cuando se quiera cambiar el gestor de bases de datos y modificar todas las consultas por lo que logra abstraerse de los particularidades de un tipo de bases de datos, sin embargo técnicamente no significa que no se tenga que aprender una base de datos como en el caso de que si queremos hacer un cambio a nivel de tabla ahi nos vemos obligados a conocer la base de datos como también en el caso de llamadas especiales se debe bajar a usar SQL en la base de datos directamente.

Page 24: Orm final

V. Bibliografía

Chapter 2. Tutorial Using Native Hibernate APIs andhbm.xml Mappings. Recuperado de: https://docs.jboss.org/hibernate/orm/3.6/quickstart/en­US/html/hibernate­gsg­tutorial­basic.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/en­US/html/session­configuration.html

Capítulo 9: Mapeo de Herencias. Recuperado de:

https://docs.jboss.org/hibernate/orm/3.5/reference/es­ES/html/inheritance.html

Generator classes in Hibernate. Recuperado de: http://www.javatpoint.com/generator­classes

VI. Anexos