Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

NHibernate 3 (Parte 4) Tabla Por Clase

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

Published Wed, Apr 20 2011 2:26 by lopez

Filed under: , ,

Comments

# NHibernate 3 (Parte 5) Primer mapeo Uno-a-Varios@ Tuesday, May 10, 2011 6:36 AM

Anterior post Próximo post Esta vez, tengo este modelo de datos para mapear a clases: Cada Book (libro

Angel "Java" Lopez

# re: NHibernate 3 (Parte 4) Tabla Por Clase@ Thursday, November 29, 2012 12:50 PM

Excelente post. Estoy haciendo un aplicativo y tengo la misma estrategia, pero me da un problema. En mi caso tengo "Persona", "Usuario" y "Cliente", en donde Usuario y Cliente heredan son personas (heredan de persona). Que pasa si un usuario es creado como cliente? intentará insertar al cliente en persona, pero no podrá porque ya está registrado como usuario. Como se soluciona?

Desde ya muchas gracias y mi felicitaciones por tu excelente blog, siempre lo visito y me entretengo mucho.

Roberto Sáez

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: