Una de las grandes ventajas que ofrece Hibernate es que es independiente al motor de base de datos que se utilice. Simplemente, haciendo una modificacion al archivo de configuración, que nos permite conectarnos con la BD, es mas que suficiente. Esto es muy interesante ya que al no trabajar con codigo SQL explícito, no es necesario andar haciendo retoques para que funcione con diferentes motores.
Porsupuesto Hibernate es software libre, por lo cual no tendremos que desembolsar un solo centavo para trabajar con el.
Como primer paso creamos un nuevo proyecto desde Visual Studio. En mi caso voy a utilizar un proyecto del tipo Aplicación de Consola, ya que solamente voy a mostrar un caso bastante sensillo. Desde ya que ustedes pueden implementar Hibernate en una infinidad de proyectos.
Una vez que hemos creado el proyecto, para implementar NHibernate, necesitamos descargar las librerias a las cuales le agregaremos las referencias correspondientes.
Para descargar la última version pueden acceder a la página:
http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0.0.GA/NHibernate-3.0.0.GA-bin.zip/download
Desde este sitio se pueden bajar la última disponible.
Una vez que la descarguen, simplemente le agregan las referencias a las siguientes librerias:
Castle.Core
Castle.DynamicProxy
Iesi.Collections
log4net
NHibernate
NHibernate.ByteCode.Castle
Como podrán observar en este caso voy a utilizar Castle. No necesariamente deben utilizar este framework, ustedes pueden elegir Spring, si así lo desean.
Una vez que agregamos las referencias al proyecto, procedamos a crear dos carpetas. En una vamos a alojar nuestras clases y en otra nuestros archivos de mapeo.
En la carpeta donde guardaremos nuestras clases, voy a generar una clase con el nombre Vehiculo. Esta clase, debe ser Serializable, por lo que debemos marcarla como tal, utilizando el atributo [Serializable]. De esta forma puedo obtener una representacion binaria de la clase que puede ser, por ejemplo escrita en disco. Esto se realiza ya que voy a serializar mi objeto con un archivo xml, que me va a servir como mapeo.
Por último los metodos de mi clase (en mi caso las Properties), tienen que implementar el modificador public virtual, para trabajar con NHibernate, y que este pueda realizar lazy loading.
Este sería un ejemplo de una clase sensilla:
Ahora pasemos a escribir nuestro xml para mapear este objeto.
Al comienzo del archivo estamos indicando el nombre del assembly "NHibernate_1", donde van a estar nuestras clases. Luego el namespace de dicha clase, y comenzamos a tratar las características de la clase que queremos mapear con el atributo class, en este caso Vehiculo. Dentro de los tags <class name="Vehiculo"...> ... </class> vamos a poner todas las configuraciones de dicha clase. Un atributo que no hemos marcado en el mapping pero que viene activado por defecto y vale la pena explicarlo es lazy="true". Con esto activamos el lazy load, de modo que las colecciones no se cargarán hasta que sean utilizadas. Este funcionamiento se logra mediante un proxy y NH se encarga de manejarlo, para nosotros es transparente (por ahora).
Con el tag <id> vamos a indicarle a NH qué property se mapeará con la clave primaria de la tabla, en este caso la property id se va a corresponder con la columna IdVehiculo, será de tipo int y para indicar que un objeto se considera como nuevo y no como que ya existe en la base, pondremos el atributo unsaved-value="0". Tambien hemos asignado al generator el valor identity, con esto le decimos a Hibernate que se encargue de generar los valores de la primary key. Si hubiéramos querido asignarles nosotros el valor, deberíamos reemplazar por el valor assigned. Luego le vamos a decir que la propiedad cantPuertas tiene que corresponderse con el atributo cantPuertas, y lo mismo para cantRuedas.
Con esto ya tenemos nuestro archivo para mapear nuestro objeto.
Lo que debemos hacer ahora es escribir nuestro archivo de configuración para que Hibernate pueda operar con nuestra base de datos. En este ejemplo voy a utilizar SQL Server 2005, desde ya que pueden utilizar cualquier otro motor, como Oracle, MySql, etc.
No hay mucho que explicar, copienlo tal cual, y en todo caso lo único que deberían modificar es el connection_string, para indicar los datos de acceso hacia su base de datos. Este archivo de configuración viene con la versión de NHibernate, por lo que con copiarlo, agregarlo a su proyecto y por último hacer las modificaciones necesarias es suficiente.
Muy bien, ahora continuemos con la instanciación de nuestro objeto, y la persistencia del mismo dentro de nuestra BD.
Como primer paso instanciamos un objeto de la clase Configuration, y le pasamos al metodo Configure, el nombre de nuestro archivo de configuración. En este caso es hibernate.cfg.xml.
Como podran observar creé un metodo que se llama CrearTablas, y que recibe la configuracion que instanciamos. Esto es basicamente, para no tener que ir a crear las tablas a mano a la base de datos, y que lo haga Hibernate por si mismo. Como ustedes quieran.
Continuamos instanciando un objeto de la clase ISessionFactory. Una sesión es un marco de trabajo en el cual NHibernate establece una conversación entre la aplicación y el motor de base de datos relacional. Para construir una sesión, representado por ISession alguien que nos provea la sesión, para esto necesitamos de: ISessionFactory. El ISessionFactory se encarga de crear sesiones en nuestra aplicación. En un momento, la aplicación puede tener 1 o más sesiones abiertas. Cada sesión representa un 1er. nivel de caché, los objetos que son traídos desde la base, o son guardados desde la aplicación se encuentran en la cache de primer nivel. Si se solicita un objeto a la base, primero se busca en la caché, si se encuentra ahí el objeto, se lo devuelve a la aplicación sin solicitarlo al motor. Sino se encuentra en la caché, se realiza la consulta a la base.
Por lo general debemos tener un ISessionFactory por aplicación, sería necesario tener más de uno en el caso de que estemos trabajando con más de una base de datos a la vez.
Instanciamos un objeto de nuestra clase Vehiculo. Le asignamos los valores que querramos, e invocamos al método Save() de nuestro objeto sesion, y le enviamos por parametros el objeto vh1, que es la instancia de nuestra clase Vehiculo. Mediante este metodo persistiremos nuestro objeto en nuestra base de datos.
Si queremos podemos ejecutar nuestro programa para ver los resultados.
Si observamos desde nuestro Motor.
Espero que les haya sido util y que puedan seguir investigando al respecto.