Primer ejemplo con NHibernate 2.x

Published on Author lopez2 Comments

Estuve trabajando creando una solución .NET que contiene un ejemplo mínimo de NHibernate 2.x. Estoy usando la distribución binaria NHibernate GA 2.0.1, siguiendo las instrucciones del manual de referencia.

Pueden bajarse el código fuente de la solución de mi Skydrive:

NHibernateExample1.zip 

Estuve usando la documentación en línea de

http://nhforge.org/doc/nh/en/

y armé el mismo manual en formato .pdf, usando comandos del trunk de SVN:

https://nhibernate.svn.sourceforge.net/svnroot/nhibernate

Si quieren, pueden bajar el manual en .pdf de este enlace:

nhibernate-reference.pdf

La solución contiene dos proyectos: una librería de clases, y una aplicación de consola:

El dominio sólo contiene una clase, Cat (estoy siguiendo el primer ejemplo que se describe en la documentación):

namespace NHibernateExample1.Domain
{
    public class Cat
    {
        private string id;
        private string name;
        private char sex;
        private float weight;

        public Cat()
        {
        }
        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual string Name
        {
            get { return name; }
            set { name = value; }
        }

        public virtual char Sex
        {
            get { return sex; }
            set { sex = value; }
        }

        public virtual float Weight
        {
            get { return weight; }
            set { weight = value; }
        }
    }
}

Hay un recurso embebido que describe el mapeo Cat.hbm.xml:

 

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="NHibernateExample1.Domain" assembly="NHibernateExample1.Domain">
  <class name="Cat" table="Cats">
    <!-- A 32 hex character is our surrogate key. It's automatically
generated by NHibernate with the UUID pattern. -->
    <id name="Id">
      <column name="CatId" sql-type="char(32)" not-null="true"/>
      <generator class="uuid.hex" />
    </id>
    <!-- A cat has to have a name, but it shouldn' be too long. -->
    <property name="Name">
      <column name="Name" length="16" not-null="true" />
    </property>
    <property name="Sex" />
    <property name="Weight" />
  </class>
</hibernate-mapping>

Hay un ExecuteAll.cmd en el directorio Sql, que crea la base de datos a usar (pueden darle como parámetro el servidor de MS SQL Server a usar,  .\SQLEXPRESS es el valor asumido):

La aplicación de consola es simple: configura NHibernate, obtiene una sesión, inserta nuevos objetos en una transacción, ejecuta una consulta, y lista el resultado:

        static void Main(string[] args)
        {
            ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

            ISession session = sessionFactory.OpenSession();
            ITransaction tx = session.BeginTransaction();

            Cat cat;

            cat = new Cat() { Name = "Moe", Sex = 'M', Weight = 9.0f };

            session.Save(cat);

            cat = new Cat() { Name = "Larry", Sex = 'M', Weight = 8.5f };

            session.Save(cat);

            cat = new Cat() { Name = "Sue", Sex = 'F', Weight = 7.5f };

            session.Save(cat);

            tx.Commit();

            IQuery query = session.CreateQuery("select c from Cat as c where c.Sex = :sex");

            query.SetCharacter("sex", 'M');

            foreach (Cat kitty in query.Enumerable())
                System.Console.Out.WriteLine("Male Cat: " + kitty.Name);

            session.Close();

            System.Console.ReadLine();
        }

Ejecutando la aplicación de consola se inserta en la base estos datos:

El ejemplo es simple. Ahora que está funcionando con NHibernate 2.0, pienso actualizar mis templates de AjGenesis para usar esa versión.

No dejen de visitar el sitio de comunidad de NHibernate, para conseguir más información:

http://nhforge.org

Si tienen dudas sobre NHibernate, pueden preguntar en el grupo en español:

NHibernate-Hispano

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com
http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *