Check the new version here

Popular channels

nHibernate

Introducción a NHibernate


Utilizar un framework de Object Relational Mapping para resolver nuestra lógica de persistencia es una técnica madura que ha demostrado ser extremadamente superior a las técnicas tradicionales basadas en el uso de APIs como ADO.NET.

Este artículo pretende introducirlos en el uso de NHibernate, un framework de ORM para .NET basado en el excelente framework Hibernate.

Introducción
.

¿Qué entendemos por lógica de persistencia?.

¿Dónde persistimos nuestros datos?.
Estrategias de persistencia.
Estrategia típica.
Estrategia recomendada.

¿Qué es NHibernate?.
¿Dónde puedo leer más acerca de las técnicas de Object Relational Mapping?.
Ejemplo práctico utilizando NHibernate.

¿Cómo se instala NHibernate?.
¿Cómo funciona NHibernate?.


Introducción

Definir la estrategia de persistencia de una aplicación es una de las decisiones de arquitectura más importantes.
En una aplicación estándar más del 50% del código generado esta relacionado con lógica de persistencia.

¿Qué entendemos por lógica de persistencia?


La lógica de persistencia abarca todo el código que mi aplicación requiere para poder grabar y recuperar la información inherente a su dominio. Por ejemplo, una
aplicación de eBanking va a persistir y recuperar información de cuentas, clientes, transacciones, etc.

¿Dónde persistimos nuestros datos?


Por lo general, la mayoría de estas aplicaciones persisten su información en una base de datos relacional (RDBMS). Si bien existen otros medios alternativos, como ser una base de datos orientada a objetos (OODBMS), ninguno de estos se
compara con la madurez y la popularidad de las bases de datos relacionales.
Utilizar un medio relacional ofrece una serie de ventajas muy importantes, por ejemplo:

• Tecnología madura
• Muy eficiente en la grabación y recuperación de grandes volúmenes de datos.
• Soportan transacciones (la mayoría).
• Aseguran la integridad de los datos (niveles de aislamiento, locking, etc.).
• Excelente manejo de la seguridad.
• Protocolo de consulta estándar (SQL).
• Buen soporte (muchos DBAs).
• Oferta variada.


Estrategias de persistencia


En una aplicación .NET, al igual que sucede con otras tecnologías, podemos implementar nuestra lógica de persistencia aplicando distintas estrategias. Como
ya mencionamos al principio, determinar cuál es la estrategia más adecuada es una decisión de arquitectura más que importante.

Estrategia típica


Para el desarrollador .NET, la estrategia más típica es utilizar directamente ADO.NET. Bajo esta estrategia, la mayor parte del código escrito se centra en recuperar un snapshot de la base de datos en un DataSet, modificar eventualmente el DataSet en memoria, para posteriormente, a través del DataAdapter correspondiente, aplicar los cambios contra la base de datos subyacente. Si bien
los DataSets funcionan correctamente, desde el punto de vista de la orientación a objetos evidencian las siguientes desventajas:

• Los DataSets representan información tabular, no representan objetos de mi dominio
• Los DataSets representan relaciones entre tablas, no representan los distintos tipos de asociaciones que surgen entre los objetos de mi dominio.
• Los DataSets son extremadamente sensibles a los cambios que puedan surgir en el esquema de la base de datos.
• El tipo de código generado para manipular los DataSets tiende a ser repetitivo y relativamente difícil de mantener.


Estrategia recomendada


Una estrategia más elegante y compatible con las buenas prácticas de diseño pregonadas en estos últimos 10 años, es la de diseñar un modelo de objetos del dominio que represente el 100% de la información que maneja mi aplicación y utilizar un framework de Object Relational Mapping (ORM) que resuelva en forma transparente la persistencia de estos objetos contra una base de datos
relacional. Utilizar un framework ORM ofrece entre otras las siguientes ventajas:

• Persistencia transparante: Mis objetos del dominio no saben nada acerca de la base de datos donde son persistidos, el framework lo resuelve en forma automática utilizando archivos de mapping expresados en XML.
• Soporte de polimorfismo: Puedo cargar jerarquías de objetos en forma polimórfica.
• Soporte de los 3 niveles de mapeo de herencia: Puedo mapear toda una jerarquía de clases a una sola tabla, crear una tabla por cada clase concreta o
crear una tabla por cada escalón de la jerarquía.
• Soporte completo de asociaciones: Los frameworks de ORM soportan el mapeo de todos los tipos de relaciones que pueden existir en un modelo de objetos del dominio (asociaciones 1..1, 1...N, N..M, unidireccionales y
bidireccionales).
• Soporte de carga de objetos Proxy: Puedo cargar objetos que solo contengan la clave del objeto completo.
• Soporte de caching: En el contexto de una transacción, puedo disminuir la cantidad de veces que voy contra la base de datos cacheando en memoria los objetos que son accedidos varias veces.
• Soporte de múltiples dialectos SQL: Puedo independizarme completamente del tipo de base de datos utilizada. Mi aplicación puede persistir sus datos en
SQL Server, en Oracle, en MySQL, etc. simplemente cambiando la configuración correspondiente.

En .NET existen varios frameworks de persistencia que implementan gran parte de
los features mencionados anteriormente. En este link pueden encontrar una lista bastante actualizada de la oferta actual

http://sharptoolbox.com/Pages/Category74089b0a-1105-4389-b1db-eedf27e20cfb.aspx.

De todos estos frameworks, consideramos que el más recomendable es NHibernate.
El resto del artículo nos enseña como utilizarlo.

¿Qué es NHibernate?


NHibernate es un framework de Object-Relational-Mapping open-source que resuelve en forma automática la persistencia de mis objetos de dominio .NET.
NHibernate esta basado en el popular framework open-source Hibernate surgido en la comunidad Java en el año 2002.

Para saber más sobre NHibernate:

http://nhibernate.org

¿Dónde puedo leer más acerca de las técnicas de Object Relational Mapping?
Existe un sin número de artículos que abordan este tema desde distintas ópticas.
Para poder profundizar más acerca de estás técnicas les recomiendo muy especialmente que lean este excelente artículo publicado por Scott Ambler.
http://www.agiledata.org/essays/mappingObjects.html

Ejemplo práctico utilizando NHibernate


Para poder probar nuestro ejemplo lo primero que tenemos que hacer es descargar la versión más actual de NHibernate e instalarla en nuestro equipo.

¿Cómo se instala NHibernate?


Fácil…simplemente descargamos la última distribución de sourceforge y descomprimimos el contenido de la misma en cualquier carpeta.

El link directo para descargar NHibernate es:


http://sourceforge.net/project/showfiles.php?group_id=73818


¿Cómo funciona NHibernate?

Para utilizar el framework debemos seguir los siguientes pasos:

• Implementar nuestras clases de dominio persistentes en .NET.
• Crear las tablas asociadas a cada clase persistente.
• Crear el archivo de mapping de cada clase persistente.
• Crear el archivo de configuración de NHibernate.
• Utilizar la API de NHibernate para persistir y recuperar mis objetos.



Los dialectos soportados actualmente por NHibernate son:


RDBMSDialect

Microsoft SQL Server 2000NHibernate.Dialect.MsSql2000Dialect

Microsoft SQL Server 7NHibernate.Dialect.MsSql7Dialect

DB2NHibernate.Dialect.DB2Dialect

PostgreSQLNHibernate.Dialect.PostgreSQLDialect

MySQLNHibernate.Dialect.MySQLDialect

Oracle (any version)NHibernate.Dialect.OracleDialect

Oracle 9/10gNHibernate.Dialect.Oracle9Dialect

SybaseNHibernate.Dialect.SybaseDialect

FirebirdNHibernate.Dialect.FirebirdDialect


Para los desarrolladores ADO.NET el valor de la propiedad
“hibernate.connection.connection_string” les debe resultar familiar.
Se trata justamente de la cadena de conexión en formato ADO.NET que NHibernate utilizará para conectarse con nuestra base de datos.
Utilizar la API de NHibernate para persistir y recuperar mis objetos.
Para poder utilizar la API de NHIbernate desde nuestra aplicación lo único que tenemos que hacer es agregar una referencia a la librería NHibernate.dll ubicada en la carpeta de \bin más la referencia a la biblioteca de clases que contiene nuestros objetos de dominio y sus mappings.

Una sesión de NHIbernate funciona como una fachada que encapsula el acceso a las funcionalidades más importantes que ofrece el framework.
A través de la sesión, NHIbernate nos permite manejar el contexto transaccional de nuestra lógica


Conclusiones

Utilizar un framework de ORM simplifica enormemente la programación de lógica de persistencia. Se trata de una idea completamente madura que cada vez se vuelve más popular. Nuestro código se abstrae completamente del schema y tipo de base de datos utilizada. Para hacer que este ejemplo funcione contra otra base de datos (ej. MySQL) lo único que tendríamos que hacer sería cambiar el dialecto y la cadena de conexión en el archivo de configuración de nuestra aplicación…nada más.

Nuestra lógica de negocios trabaja contra un modelo de dominio completamente orientado a objetos.
Generamos entre un 30% y un 40% menos de código y como si esto fuera poco el tipo de código generado es mucho más
sencillo y mantenible.
0
0
0
1
0No comments yet