Creando el mapping de una legacy DB en la oficina, me topé con el mapping de herencia de NHibernate (muy efectivo por cierto). Aunque ya he mapeado herencia anteriormente en NHibernate, algo que irrita de sobremanera es el archivo gigante que se crea ante la clase base. Revisando la documentación de NHibernate me topo con el concepto de mapas modulares para clases de herencia, algo que nos resuelve los dolores de cabeza con mapeos de herencia muy grandes
Tomemos por ejemplo este mapping:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Sample"
namespace="Sample">
<class name="Member" table="members">
<id name="Username" column="username">
<generator class="assigned" />
</id>
<discriminator column="type" type="Int32" />
<property name="FirstName" column="first_name" not-null="true" />
<property name="LastName" column="last_name" not-null="true" />
<property name="Email" column="email" not-null="true" />
<property name="BirthDate" column="birthdate" not-null="true" />
<joined-subclass table="students" name="Student">
<key column="student_id" />
<property name="Added" />
</joined-subclass>
</class>
</hibernate-mapping>
(Para comprender un poco más de herencia en nhibernate usando joined-subclass recomiendohttp://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/inheritance.html en la documentación de NHibernate).
Bien, lo feo es que si he de mapear 5 clases heredadas debo agregar cada joined-subclass en el mismo archivo y eso me crearía archivos de mapeo poco portables y de díficil mantenimiento. Es cuando llega a salvar los archivos de mapeo modular.
En el caso anterior movemos la declaración de joined-subclass de Student a su propio archivo hbm y solo variamos agregandole el atributo “extends” indicando que clase (definida en su propio hbm) extendemos.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Sample"
namespace="Sample">
<joined-subclass table="students" name="Student"
extends="Member">
<key column="student_id" />
<property name="Added" />
</joined-subclass>
</hibernate-mapping>
Sencillo no?
Otro día hablaremos un poco más de nuestro siempre versátil NHibernate
