.NETismo

Persistencia de Objetos en .NET

Quien vea nuestros proyectos en .NET, enseguida adivinará que venimos de un fuerte “background” Java… En parte por el estilo de programación (contrato contra la interfaz siempre) pero sobre todo por los frameworks y patrones que usamos. Uno de ellos es un framework de ORM (Object-Relational-Mapping) llamado NHibernate, que es un port de la versión Java (Hibernate).

Un Framework de ORM es algo que suena a complicado cuando te lo explican, pero es brutalmente simple cuando ves un ejemplo:

Pongamos que yo tengo la tabla PERSONA (PERSONA_ID, NOMBRE) y la tabla DIRECCION ( DIRECCION_ID, PERSONA_ID, TEXTO_DIRECCION), con sus PKs correspondientes.

Con .NET, tradicionalmente me crearía DataSets, DataReaders, Commands y Connections para acceder a la base de datos. Sin embargo, con cualquier ORM de Java o .NET, lo que haría sería definirme las clases de las dos entidades, las mapearía con unos ficheros XML cada una a su tabla, y trabajaría únicamente con Objetos.

Las ventajas de esto son varias. Por un lado, el código de los objetos no depende de la capa de acceso a datos (NHibernate), por lo que tenemos menos acoplamiento. Por otro, no ensuciamos las distintas capas con cosas que no le conciernen (no devolvemos datasets a la capa de presentación, sino que devolvemos objetos — separation of concerns lo llaman los guiris).
Pensar en objetos que ya están relacionados estáticamente es mucho más sencillo que pensar en conjuntos de datos y tablas de base de datos cuyas relaciones se crean desde la misma consulta mediante joins. Esto se nota mucho cuando vas a hacer consultas con NHibernate. En NHibernate el lenguaje de consultas principal no es SQL (aunque se puede utilizar, con algunas restricciones), sino que es uno propio llamado HQL. El HQL es un SQL orientado a objetos… esto puede sonar raro, pero ahi va un un ejemplo:

“Obtener Todas las personas cuya dirección contiene la palabra ‘calle’ ”
SQL: SELECT p.* FROM PERSONA p, DIRECCION d WHERE p.PERSONA_ID=d.PERSONA_ID and d.TEXTO LIKE ‘%calle%’

HQL: from Persona p where p.Direccion.Texto like ‘%calle%’

En un ejemplo tan pequeño parece que son pocas las diferencias, pero imagina que el modelo de datos es mucho más extenso…

HQL: from Producto p where p.Catalogo.Temporada.Responsable.Edad<30

La versión SQL crecería y se haría enorme, mientras que la versión HQL se aprovecha de que las relaciones están bien definidas y son estáticas,permitiendo que sea mucho más sencilla,
Además, al usar HQL y ser éste un lenguaje de consultas genérico independiente del motor de BD que usemos ( luego NHibernate lo transforma al SQL nativo de cada base de datos), no hay problemas de portabilidad de las sentencias SQL entre bases de datos. Una misma aplicación hecha con NHibernate puede funcionar sin modificaciones en MySQL y en MS-SQL, sin repetir una sola consulta, incluyendo paginaciones, joins, agregados…
Hay un articulo muy sencillo, un quickstart, que explica mucho mejor que yo todo lo necesario para empezar con NHibernate: http://www.hibernate.org/hib_docs/nhibernate/html/quickstart.html

public static void main(String argv[]) {

Aquí empieza mi Blog. Este es el primer post, y no se si será el último… depende de cómo me dé. El caso es que hace tiempo que tenía ganas de montar un sitio donde “pastear” las cosas interesantes que me voy encontrando, las ideas y opiniones que vayan surgiendo, y también las tonterías que me vaya dando la gana colgar aquí :) . Me he decidido a raiz de ver lo “fácil” que le ha sido a una ex-compañera (http://sitiogeek.wordpress.com) montarlo y empezar a postear cosas… me ha dado envidia básicamente :D
Ah, aviso, tengo cero idea de blogs, así que seguramente haré varias cosas mal, pero me da igual :)