Sie sind auf Seite 1von 14

1

1 Programacion III UTN Reconquista


Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Introduccin a Hibernate
Hibernate es una herramienta de Mapeo objeto-relacional (ORM) para la plataforma Java (y disponible
tambin para .Net con el nombre de NHibernate) que facilita el mapeo de atributos entre una base de
datos relacional tradicional y el modelo de objetos de una aplicacin, mediante archivos declarativos
(XML) o anotaciones en los beans de las entidades que permiten establecer estas relaciones.

Hibernate es software libre, distribuido bajo los trminos de la licencia GNU LGPL.
Como todas las herramientas de su tipo, Hibernate busca solucionar el problema de la diferencia entre
los dos modelos de datos coexistentes en una aplicacin: el usado en la memoria de la computadora
(orientacin a objetos) y el usado en las bases de datos (modelo relacional). Para lograr esto permite al
desarrollador detallar cmo es su modelo de datos, qu relaciones existen y qu forma tienen. Con esta
informacin Hibernate le permite a la aplicacin manipular los datos en la base de datos operando sobre
objetos, con todas las caractersticas de la POO. Hibernate convertir los datos entre los tipos utilizados
por Java y los definidos por SQL. Hibernate genera las sentencias SQL y libera al desarrollador del
manejo manual de los datos que resultan de la ejecucin de dichas sentencias, manteniendo la
portabilidad entre todos los motores de bases de datos con un ligero incremento en el tiempo de
ejecucin.
Hibernate est diseado para ser flexible en cuanto al esquema de tablas utilizado, para poder
adaptarse a su uso sobre una base de datos ya existente. Tambin tiene la funcionalidad de crear la base
de datos a partir de la informacin disponible.
Hibernate ofrece tambin un lenguaje de consulta de datos llamado HQL (Hibernate Query Language), al
mismo tiempo que una API para construir las consultas programticamente (conocida como "criteria").
Hibernate para Java puede ser utilizado en aplicaciones Java independientes o en aplicaciones Java EE,
mediante el componente Hibernate Annotations que implementa el estndar JPA, que es parte de esta
plataforma.

Historia
Hibernate fue una iniciativa de un grupo de desarrolladores dispersos alrededor del mundo conducidos
por Gavin King. Tiempo despus, JBoss Inc. (empresa comprada por Red Hat) contrat a los principales
desarrolladores de Hibernate y trabaj con ellos en brindar soporte al proyecto.
La rama actual de desarrollo de Hibernate es la 3.x, la cual incorpora nuevas caractersticas, como una
nueva arquitectura Interceptor/Callback, filtros definidos por el usuario, y opcionalmente el uso de
anotaciones para definir la correspondencia en lugar de (o conjuntamente con) los archivos XML.
Hibernate 3 tambin guarda cercana con la especificacin EJB 3.0 (aunque apareciera antes de la
publicacin de dicha especificacin por Java Community Process) y acta como la espina dorsal de la
implementacin de EJB 3.0 en JBoss.
Utilizar un framework de Object Relational Mapping para resolver nuestra lgica de persistencia es una
tcnica madura que ha demostrado ser extremadamente superior a las tcnicas tradicionales basadas
en el uso de APIs como ADO.NET.

Preguntas Frecuentes
Qu entendemos por lgica de persistencia?
Dnde persistimos nuestros datos?
Estrategias de persistencia.
Estrategia tpica.
Estrategia recomendada.



2


2 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Qu es NHibernate?
Dnde puedo leer ms acerca de las tcnicas de Object Relational Mapping?
Ejemplo prctico utilizando NHibernate.
Cmo se instala NHibernate?
Cmo funciona NHibernate?

Introduccin
Definir la estrategia de persistencia de una aplicacin es una de las decisiones de arquitectura ms
importantes.
En una aplicacin estndar ms del 50% del cdigo generado est relacionado con lgica de persistencia.

Qu entendemos por lgica de persistencia?
La lgica de persistencia abarca todo el cdigo que mi aplicacin requiere para poder grabar y recuperar
la informacin inherente a su dominio. Por ejemplo, una aplicacin de eBanking va a persistir y
recuperar informacin de cuentas, clientes, transacciones, etc.

Dnde persistimos nuestros datos?
Por lo general, la mayora de estas aplicaciones persisten su informacin 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:

Tecnologa madura
Muy eficiente en la grabacin y recuperacin de grandes volmenes de datos.
Soportan transacciones (la mayora).
Aseguran la integridad de los datos (niveles de aislamiento, locking, etc.).
Excelente manejo de la seguridad.
Protocolo de consulta estndar (SQL).
Buen soporte (muchos DBAs).
Oferta variada.

Estrategias de persistencia
En una aplicacin .NET, al igual que sucede con otras tecnologas, podemos implementar nuestra lgica
de persistencia aplicando distintas estrategias. Como ya mencionamos al principio, determinar cul es la
estrategia ms adecuada es una decisin de arquitectura ms que importante.

Estrategia tpica
Para el desarrollador .NET, la estrategia ms tpica es utilizar directamente ADO.NET.
Bajo esta estrategia, la mayor parte del cdigo escrito se centra en recuperar un snapshot de la base de
datos en un DataSet, modificar eventualmente el DataSet en memoria, para posteriormente, a travs
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 orientacin a objetos evidencian las
siguientes desventajas:




3


3 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Los DataSets representan informacin 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 cdigo generado para manipular los DataSets tiende a ser repetitivo y relativamente difcil
de mantener.

Estrategia recomendada
Una estrategia ms elegante y compatible con las buenas prcticas de diseo pregonadas en estos
ltimos 10 aos, es la de disear un modelo de objetos del dominio que represente el 100% de la
informacin que maneja mi aplicacin 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 automtica utilizando archivos de mapping
expresados en XML.
Soporte de polimorfismo: Puedo cargar jerarquas de objetos en forma polimrfica.
Soporte de los 3 niveles de mapeo de herencia: Puedo mapear toda una jerarqua de clases a una sola
tabla, crear una tabla por cada clase concreta o crear una tabla por cada escaln de la jerarqua.
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 transaccin, 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 mltiples dialectos SQL: Puedo independizarme completamente del tipo de base de datos
utilizada. Mi aplicacin puede persistir sus datos en
SQL Server, en Oracle, en MySQL, etc. simplemente cambiando la configuracin correspondiente.

En .NET existen varios frameworks de persistencia que implementan gran parte de los features
mencionados anteriormente.

De todos estos frameworks, consideramos que el ms recomendable es NHibernate.

Qu es NHibernate?
NHibernate es un framework de Object-Relational-Mapping open-source que resuelve en forma
automtica la persistencia de mis objetos de dominio .NET.
NHibernate est basado en el popular framework open-source Hibernate surgido en la comunidad Java
en el ao 2002.






4


4 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Cmo 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 configuracin 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
Existen otros drivers para NHibernate (puede funcionar con cualquier conector ADO)

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 conexin 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 aplicacin lo nico que tenemos que hacer es
agregar una referencia a la librera NHibernate.dll ubicada en la carpeta de <NHibernate-Home>\bin
ms la referencia a la biblioteca de clases que contiene nuestros objetos de dominio y sus mappings.

Una sesin de NHIbernate funciona como una fachada que encapsula el acceso a las funcionalidades
ms importantes que ofrece el framework.
A travs de la sesin, NHIbernate nos permite manejar el contexto transaccional de nuestra lgica

Conclusiones
Utilizar un framework de ORM simplifica enormemente la programacin de lgica de persistencia. Se
trata de una idea completamente madura que cada vez se vuelve ms popular. Nuestro cdigo 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 tendramos que hacer sera cambiar el
dialecto y la cadena de conexin en el archivo de configuracin de nuestra aplicacinnada ms.

Nuestra lgica de negocios trabaja contra un modelo de dominio completamente orientado a objetos.
Generamos entre un 30% y un 40% menos de cdigo y como si esto fuera poco el tipo de cdigo
generado es mucho ms
sencillo y mantenible.



5


5 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Tutorial de NHibernate - Primeros pasos
NHibernate es un framework de O/RM (Object/Relational Mapping), un port de Hibernate de Java, que tiene como
funcin principal mapear los objetos desde una aplicacin .Net a una base de datos Relacional. Primero, hablemos
de como NH (NHibernate) realiza su funcionamiento bsico.
Cdigo de ejemplo
En el siguiente ejemplo ser solamente puntapi inicial para introducirnos en este framework de persistencia, si bien
contiene algunos consejos como buenas prcticas pero no es lo que persigue, por esta razn los ejemplos sern
sencillos. De hecho, el modelo posee una clara correspondencia de 1 objeto => 1 tabla, lo cual en la realidad no debe
buscarse, ya que los modelos de dominios y de datos buscan resolver problemas diferentes, y si estamos en
presencia de esto, es muy probable que no estemos explotando todo el potencial de ambos modelos, y por sobre todo
de esta herramienta. NHibernate nos da la libertad de realizar un modelo de dominio, y despus mapearlo a un
modelo de tablas, y viceversa.

Modelo de Dominio
El modelo de dominio con el cual trabajaremos ser el siguiente:



6


6 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Modelo relacional
El modelo de datos estar representado por estas tres relaciones (tablas):

Mappings Files Archivos de Mapeo:
NH para poder conocer la correspondencia que existe entre los objetos y las tablas lo hace por medio de la
configuracin de mapeo. Esta configuracin se puede hacer de forma programtica o bien, la ms utilizada, que
consiste en archivos de mapeo XML (mapping files). Estos archivos poseen la informacin necesaria para poder
saber en qu tabla/s se tiene/n que guardar cada objeto en que tabla tengo que buscar para obtener un objeto. Los
nombres de los archivos terminan con el sufijo .hbm.xml. Las extensiones de estos archivos xml es .hbm.xml. Por
ejemplo Factura.hbm.xml, LineaFactura.hbm.xml, Producto.hbm.xml.
Archivo de Mapeo de la clase Factura (Factura.hbm.xml):
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Dario.NH01"
namespace="Dario.NH01.Entidades">

<class name="Factura">
<id name="Id" column ="IdFactura" type="int" unsaved-value="0">
<generator class="identity"/>
</id>
<property name="Fecha" type="DateTime" not-null="true"/>
<bag name="Lineas" cascade="all-delete-orphan">
<key column="IdFactura"/>
<one-to-many class="LineaFactura"/>
</bag>
</class>
</hibernate-mapping>

Veamos los atributos del archivo. Al comienzo del archivo estamos indicando el nombre
del assembly: Dario.NH01, donde van a estar ubicadas las clases. Luego el namespace de dicha clase. Luego
comenzamos a tratar las caractersticas de la clase que queremos mapear con el atributo class, en este
caso Factura. Dentro de los tags <class name="Factura"...> ... </class> vamos a indicar 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 la carga perezosa, lazy load, de modo
que las colecciones no se cargarn 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 ser mapear con la clave primaria de la tabla, en este caso la
property Id se va a corresponder con la columna IdFactura, 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 NH que se encargue de generar los
valores de la primary key. Si hubiramos querido asignarles nosotros el valor, deberamos reemplazar por el


7


7 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
valor assigned. Luego vamos a decirle que la propiedad Fecha, tiene que corresponderse con la
columna Fecha, esto es debido que no hemos indicado el nombre de la columna con el atributo column, y que va
a ser de tipo DateTime. Y con esto ya tenemos suficiente como realizar un ABM (Alta/Baja/Modificacin) de la
entidad Factura.
Pero para hacer un poco ms interesante esto, agreguemos la relacin 1:N con la clase LineaFactura. Para esto
vamos a utilizar el atributo <bag>. Indicamos que el nombre de la coleccin se llamarLineas, y como es bag,
esta coleccin podr tener elementos repetidos. Para esto utilizamos una coleccin del
tipo IList<LineaFactura>. Cabe destacar que podemos utilizar otro tipo de colecciones que se encuentran en
la librera Iesi.Collections.dll.
Archivo de Mapeo de la clase LineaFactura (LineaFactura.hbm.xml):
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Dario.NH01"
namespace="Dario.NH01.Entidades">

<class name="LineaFactura">

<id name="Id" column ="IdLineaFactura" type="int" unsaved-value="0">
<generator class="identity"/>
</id>

<property name="Cantidad" type="int" />
<property name="Precio" type ="Decimal"/>

<many-to-one name="Factura" column="IdFactura" />
<many-to-one name="Producto" column="IdProducto" />

</class>
</hibernate-mapping>
Algo a notar en este archivo es la declaracin de la relacin many-to-one para la propiedad Factura y tambin
para Producto.
Archivos de mapeo como recursos embebidos
Es una prctica muy comn y recomendable el incluir los archivos de mapeo como recursos embebidos dentro de un
assembly. Cualquier IDE de desarrollo moderna -Sharp Develop, Visual Studio Monodevelop-, nos permiten
configurar las propiedades de los archivos y que accin se debe tomar con ellos, dicha opcin se llama Action Build
/ Accin de Construccin y entonces debemos configurarla como: Embedded Resource/Recurso
embebido. Si olvidamos hacer esto con los archivos de mapeo, es posible que no tengamos ningn error en
algunos casos, pero no funcionar correctamente.
Preparando las clases
Mtodos y Propiedades
Al estar trabajando con clases con lazy="true", que es el valor por defecto, todos los mtodos y propiedades
deben ser declarados como virtual. De este modo NH puede crear un proxy de nuestras entidades, esto es
transparente para nosotros.
Sobrescribiendo Equals y GetHashCode
Para poder trabajar correctamente con colecciones debemos sobrescribir estos mtodos. Sino sobrescribimos
el Equals al hacer una operacin como lineaFactura1.Equals(lineaFactura2) podra
devolver false an tratndose de la misma linea de factura, debido a que la comparacin se est haciendo por la
posiciones de memoria. Cuando sobrescribimos Equals por ejemplo de esta manera:


8


8 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
public override bool Equals(object obj)
{
if (this == obj) return true;
LineaFactura lineaFactura = obj as LineaFactura;
if (lineaFactura == null) return false;
return id == lineaFactura.id && Equals(factura, lineaFactura.factura);
}

De este modo nos aseguramos de que 2 objetos son iguales si son iguales sus propiedades Id y Factura.
Ya hemos sobrescrito el Equals, ahora debemos hacer lo mismo con GetHashCode, debido a que 2 objetos
iguales deben tener un mismo nmero de hash (y 2 objetos distintos pueden o no tener el mismo nmero de hash). El
nmero hash no representa un id, no tiene que ser nico.
Una posible implementacin podra ser:
public override int GetHashCode()
{
return id + 29*factura.GetHashCode();
}
Con este mtodo nos aseguramos que 2 lneas factura devuelvan el mismo nmero al ser iguales. Al trabajar con
nmeros primos obtenemos buenas funciones hash. Lo importante aqu es hacer bien la funcin, la optimizacin de
esta funcin queda fuera del alcance del tutorial.
Implementando IEquatable<T>
Todas las entidades implementan IEquatable<T>, esto no es necesario para trabajar con NHibernate, solamente
es una manera de hacer que las comparaciones por medio de Equals se realicen de forma tipada.
ISessionFactory e ISession
Una sesin es un marco de trabajo en el cual NH establece una conversacin entre la aplicacin y el motor de base
de datos relacional. Para construir una sesin, representado por ISession alguien que nos provea la sesin, para
esto necesitamos de: ISessionFactory. El ISessionFactory se encarga crear sesiones en nuestra
aplicacin. En un momento, la aplicacin puede tener 1 o ms sesiones abiertas. Cada sesin representa un 1er. nivel
de cach, los objetos que son trados desde la base, o son guardados desde la aplicacin 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 aplicacin sin solicitarlo al motor relacional. Sino se encuentra en la cach, se realiza la consulta a la
base.
Por lo general debemos tener un ISessionFactory por aplicacin, sera necesario tener ms de uno en el caso de que
estemos trabajando con ms de una base de datos a la vez.
Configuracin del ISessionFactory de la aplicacin
Para configurar el ISessionFactory, es decir, para decirle con qu motor de base de datos vamos a trabajar, la cadena
de conexin (connection string), el driver que utilizaremos entre otras cosas, como toda configuracin en NH, se
puede realizar de manera programtica (por cdigo) o mediante archivos de configuracin XML, y dentro de esta
ltima podemos hacerlo mediando el App.config o mediante elhibernate.cfg.xml. Utilizaremos la ltima
en este caso:









9


9 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NH01">
<property
name="connection.provider">NHibernate.Connection.DriverConnectionProvider</pr
operty>
<property
name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="connection.connection_string">Data
Source=localhost\SQLEXPRESS;Initial Catalog=NH01;Integrated
Security=True</property>
<property name="show_sql">true</property>

<mapping assembly="Dario.NH01" />

</session-factory>
</hibernate-configuration>

En esta configuracin hemos incluido el nombre del assembly donde se encontrarn embebidos los archivos de
mapeo, en este caso el assembly es: Dario.NH01.
El cdigo necesario para configurar NH al comienzo de la aplicacin es:
Configuration cfg = new Configuration();

cfg.Configure("hibernate.cfg.xml");

ISessionFactory sesiones = cfg.BuildSessionFactory();

ISession sesion = sesiones.OpenSession();

Primeramente debemos crear un objeto del tipo Configuration, configurarlo
mediante Configure("hibernate.cfg.xml") y que se encargue de crear el ISessionFactory, por
medio del mtodoBuildSessionFactory(). Una vez que creamos el objeto sesiones del
tipo ISessionFactory, ya podemos comenzar a crear objetos ISession. En este caso trabajaremos con una
sola sesin en la aplicacin: sesion.
Es una buena prctica realizar un singleton del objeto ISessionFactory debido a que es un proceso costoso
para la aplicacin, en otras palabras, la ejecucin de BuildSessionFactory se debe hacer una vez durante la
ejecucin.
Creamos Productos, Facturas y Lneas
Ahora comenzamos con el cdigo de ejemplo, primero creamos Productos y los guardamos:
Producto prod1 = new Producto("Leche Entera", "Lacteos");
Producto prod2 = new Producto("Lavandina", "Limpieza");
Producto prod3 = new Producto("Vasos", "Bazar");

sesion.Save(prod1);
sesion.Save(prod2);
sesion.Save(prod3);

Creamos 3 productos y los guardamos en la sesin sesion mediante el mtodo Save. Una vez hecho esto
podemos continuar con la creacin de la Factura y sus LineaFactura.


10


10 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
Factura factura = new Factura(DateTime.Now);
factura.Lineas.Add(new LineaFactura(factura, prod1, 2.25m, 5));
factura.Lineas.Add(new LineaFactura(factura, prod2, 3.5m, 1));
factura.Lineas.Add(new LineaFactura(factura, prod3, 5.4m, 10));

sesion.Save(factura);

sesion.Flush();

sesion.Close();

Una vez creada factura, podemos realizar un Save . Notse aqu que hemos guardado la factura, y las lneas
tambin se guardaron. Esto es debido a que en el mapping de Factura hemos configurado el
Agregado/Actualizacin/Borrado en cascada mediante la siguiente lnea cascade="all-delete-orphan".
Despus de realizar todos las inserciones, procedemos a realizar Flush() para que se ejecuten las sentencias SQL
propiamente dichas contra el servidor, en ese momento se guardan todos nuestros objetos, antes de esto los objetos
permanecan en el objeto sesion (en la cache de 1er. nivel).
Luego de que hemos usado la sesin, liberamos los recursos realizando un Close().
Intellisense para los archivos de mapeo en Visual Studio
Los archivos de mapeo de este ejemplo fueron escritos sin ayuda de una herramienta de generacin de cdigo.
Solamente con ayuda del Intellisense de Visual Studio en los archivos XML. Para tener esta funcionalidad se deben
copiar los archivos nhibernate-mapping-2.2.xsd y nhibernate-configuration-2.2.xsd al
directorio C:\Archivos de programa\Microsoft Visual Studio 8\Xml\Schemas donde se tiene
instalado el Visual Studio.


























11


11 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
El primer proyecto usando NHibernate
1. Crear un proyecto utlizando C# como lenguaje, una Console Application. Llamarlo Practica1.
2. En la solapa References agregar las libreras necesarias para trabajar con el framework ORM
NHibernate.



3. En el proyecto, crear dos carpetas, Entities y Mappings, Entities contendr nuestras Clases y
Mapping los archivos de mapeo (hbm) que necesita NHibernate para asociar las clases a una
base de datos relacional.



4. Sobre la carpeta Entities, creamos nuestra Clase Persistente.



12


12 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
5. En la carpeta Mappings crear el archivo hbm (archivo xml) de Mapeo.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Practica1"
namespace="Practica1.Entities">

<class name="Grupos" table="grupos">

<id name="Id" column ="ID" type="long" unsaved-value="0">
<generator class="native"/>
</id>

<property name="Descrip" column="descrip" not-null="false"
type="string"/>

</class>

</hibernate-mapping>

En NHibernate, los archivos de mapeo se deben marcar como Embedded Resource en la opcin
Build Action



6. Ahora creamos el archivo de configuracin de hibernate, en la raz del proyecto (archivo xml)


El archivo de configuracin de hibernate contiene la informacin inherente a la base de datos relacional
a utilizar, las directivas para la creacin de tablas, la localizacin de los Mappings, etc.




13


13 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="HibernateSession">

<property
name="connection.provider">NHibernate.Connection.DriverConnectionProvider
</property>
<property
name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<property name="dialect">NHibernate.Dialect.MySQLDialect</property>
<property
name="connection.connection_string">Server=localhost;Database=sistemas3;User
ID=root;Password=</property>
<property name="show_sql">true</property>

<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create-drop</property>

<mapping assembly="Practica1" />
</session-factory>
</hibernate-configuration>


En NHibernate, el archivo hibernate.cfg.xml debe marcarse como Copy Always en la opcin
Copy to Output Directory



Operaciones ms frecuentes de Hibernate
Save persiste un objeto
SaveorUpdate persiste/actualiza un objeto
Update actualiza un objeto
Remove elimina un objeto

Las operaciones de Hibernate se llevan a cabo en el marco de tres objetos
Configuration: es el objeto que carga las configuraciones especificadas en el hibernate.cfg.xml
SessionFactory: es el encargado de entablar una conversacin con la Base de Datos.
Session: se instancia a partir de un SessionFactory y permite trabajar con objetos y consultas (HQL, Linq,
Criteria, Native SQL)




14


14 Programacion III UTN Reconquista
Documento de: A.S.: Silvio Moschen provisto para Marcelo Agustini
7. Probando NHibernate, escribir el test en el archivo Program.css


using System;
using System.Collections.Generic;
using System.Text;
using NHibernate.Cfg;
using NHibernate;
using Practica1.Entities;

namespace Practica1
{
class Program
{
static void Main(string[] args)
{
Configuration cfg = new Configuration();

cfg.Configure("hibernate.cfg.xml");

ISessionFactory sesiones = cfg.BuildSessionFactory();

ISession sesion = sesiones.OpenSession();

Grupos g1 = new Grupos();
g1.Descrip = "Grupo NHibernate 1";

sesion.Save(g1);

Grupos g2 = new Grupos();
g2.Descrip = "Grupo NHibernate 2";

sesion.Save(g2);

sesion.Flush();

IQuery query = sesion.CreateQuery("from Grupos c");
IList<Grupos> lista = query.List<Grupos>();
foreach (Grupos c in lista)
Console.WriteLine("ID.: " + c.Id.ToString() +
" Grupo: " + c.Descrip);

sesion.Close();

Console.ReadLine();
}
}
}

Das könnte Ihnen auch gefallen