¿Qué es NHibernate?

Introducción

Hola,

Antes de empezar, déjame decirte que si no sabes lo que es un ORM, deberías leerte esta entrada.

Recordemos que un ORM es una librería/framework que nos permite convertir datos entre un sistema orientado a objetos y una base de datos relacional.

Si trabajas con C# y te has peleado alguna vez con SQL, probablemente ya te preguntaste si hay una forma más simple de conectar tu código con la base de datos.

Spoiler: ¡sí la hay! Y se llama NHibernate.

Pues hoy he venido a hablarte de NHibernate, un ORM para C#.

Vamos a verlo …

¿Qué es NHibernate?

NHibernate es un ORM (Object-Relational Mapper) para C#.

NHibernate es un port para C# del proyecto Hibernate en Java.

¿Eso qué significa? Básicamente, que te permite trabajar con tu base de datos como si estuvieras usando objetos normales de C#. En lugar de escribir consultas SQL por todos lados, usas clases, propiedades y métodos. Así de fácil.

¿Y lo mejor? NHibernate se encarga de traducir tus objetos en tablas, columnas y registros… sin que tengas que tocar ni una línea de SQL (a menos que quieras). Es como tener un asistente personal que se encarga del papeleo mientras tú te concentras en la lógica de tu aplicación.

¿Suena bien, no? Pues eso es solo el comienzo.

En este entrada vamos a ver qué hace a NHibernate tan útil.

Ahora que ya sabes qué es NHibernate, es momento de arremangarse y ver cómo se usa en la vida real.

Vamos a construir algo simple, paso a paso, para que veas el flujo completo.

¿Listo?

Clase

Primero, imaginemos que queremos construir una app para guardar libros. Sí, un clásico 🙂

Creamos una clase sencilla:

public class Libro
{
    public virtual int Id { get; set; }
    public virtual string Titulo { get; set; }
    public virtual string Autor { get; set; }
    public virtual int Anio { get; set; }
}

La palabra virtual es importante. NHibernate la usa para hacer su magia con los proxies.

Archivo de mapping

Sí, NHibernate usa archivos .hbm.xml. Pero no te asustes, es más fácil de lo que suena.

Creamos un archivo para la clase Libro que hemos creado llamado Libro.hbm.xml:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="TuProyecto.Modelo.Libro" table="Libros">
    <id name="Id">
      <generator class="identity"/>
    </id>
    <property name="Titulo"/>
    <property name="Autor"/>
    <property name="Anio"/>
  </class>
</hibernate-mapping>

Ojo con la ruta en name. Tiene que coincidir con el namespace completo de tu clase.

Configuración

Ahora toca decirle a NHibernate cómo conectarse a la base de datos.

Crea un archivo hibernate.cfg.xml en la raíz del proyecto:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">
      Data Source=localhost;Initial Catalog=MiLibreria;Integrated Security=True
    </property>
    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
    <property name="show_sql">true</property>
    <mapping resource="TuProyecto.Modelo.Libro.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Si usas otro motor (como PostgreSQL), cambia el driver_class y el dialect.

Uso

Ahora sí, lo bueno: usar NHibernate en el código:

using NHibernate;
using NHibernate.Cfg;

class Program
{
    static void Main()
    {
        var cfg = new Configuration();
        cfg.Configure(); // Lee hibernate.cfg.xml
        var sessionFactory = cfg.BuildSessionFactory();

        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            var libro = new Libro
            {
                Titulo = "C# para humanos",
                Autor = "Jane Doe",
                Anio = 2024
            };

            session.Save(libro);  // ¡Guardado con magia!
            transaction.Commit();
        }
    }
}

Conclusiones

Como hemos visto, utilizar NHibernate no es tan complicado como suena.

Al principio puede parecer que hay muchas piezas (clases, XML, configuración…), pero una vez que lo armas, todo fluye como si fuera magia. Es como montar una bicicleta: cuesta un poco al principio, pero luego te lleva a donde quieras sin esfuerzo.

NHibernate te da flexibilidad, control total y una forma elegante de manejar tus datos sin ensuciar tu código con SQL por todos lados. Ideal si te gusta tener el poder en tus manos y no depender de frameworks que te imponen su forma de trabajar.

¿Vale la pena aprenderlo? Totalmente. Especialmente si trabajas con proyectos grandes, legacy o necesitas algo más personalizable que Entity Framework.

¿El siguiente paso? Jugar con consultas, relaciones entre tablas, y si no te gusta el XML, pásate a Fluent NHibernate.

Lo importante es que ahora ya sabes cómo dar el primer paso… y eso, amigo/a, es lo más difícil de cualquier camino.

Deja un comentario