NHibernate 3 (Parte 4) Tabla Por Clase

Published on Author lopez1 Comment

Anterior post
Siguiente post

En los anteriores posts (Tabla por Jerarquía, Tabla por Clase Concreta), implementé dos estrategias de mapeo sobre el mismo modelo:

Ahora, quiero mapear CADA tabla a una tabla:

 

La solución tiene dos proyectos, uno del proyecto de consola, y el otro es una librería de clase:

Pueden bajar el código desde NHibernate3ItemsTablePerClass.zip. Necesitan agregar las librerías NHibernate (ver post anterior para más detalles). La base de datos puede crearse ejecutando ExecuteAll.cmd en el directorio Sql. El comando acepta un parámetro (como ExecuteAll (local)) que indique el servidor de base de datos. El valor asumido es .\SQLEXPRESS.

El mapeo de Item:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ItemsTablePerClass.Domain"
namespace="ItemsTablePerClass.Domain">
  <class name="Item" table="Items">
    <id name="Id">
      <generator class="guid.comb" />
    </id>
    <property name="Title" not-null="true" />
    <property name="Description" not-null="true" />
  </class>
</hibernate-mapping>

Hay un atributo table, y ya no hay valor de discrimiator. Lo nuevo está en el mapeo de Note:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ItemsTablePerClass.Domain"
namespace="ItemsTablePerClass.Domain">
  <joined-subclass name="Note" extends="Item" table="Notes">
    <key column="Id" />
    <property name="Content" />
  </joined-subclass>
</hibernate-mapping>

El nuevo elemento es joined-subclass. Hay un atributo de table para este mapeo, también. Y no hay elemento id. Fue reemplazado por el elemento  key que uno ambas tablas.

Cambios similares en el mapeo de Page:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="ItemsTablePerClass.Domain"
namespace="ItemsTablePerClass.Domain">
  <joined-subclass name="Page" extends="Item" table="Pages">
    <key column="Id" />
    <property name="Url"/>
  </joined-subclass>
</hibernate-mapping>

Notablemente, el código principa es el mismo que en los anteriores ejemplos. Y las clases del dominio siguen sin cambios.

Los próximos pasos: comenzar a investigar mapeos uno-a-varios, otras alternativas de mapeo (como Fluent NHibernate, ConfORM, y la nueva API de NHibernate 3.2).

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 *