Hola Leo,
Yo hice hace tiempo la pregunta, porque estaba en un caso bastante parecido,
y lo termine haciendo como vos. Pero te recomiendo que primero leas el post
que Fabio me hizo leer en aquel tiempo:
http://groups.google.com.ar/group/NHibernate-Hispano/msg/030f413ca27cadd2

Creo que podes hacer cualquiera de las 2 opciones (decorator o simplemente
manejarlo como roles), pero hacerlo como decorator (mas alla de si es
correcto el modelo) es bastante complicado para manejarle la persistencia.
Yo tengo hecho una clase tipo Factory que me ayuda, y asi y todo fue
bastante complicado.
Te planteo uno de los casos que vas a tener que manejar para que funcione
bien:

Persona p = /* obtener la persona de algun lado */;

Medico m = Factory.DecorarA<Medico> (p);
m.Licencia = 123;

Paciente pa = Factory.DecorarA<Paciente> (p);
pa.Estado = Estado.CasiMuerto;          // ;)

Repositorio.Save(pa);

Ahí el problema que vas a tener es que vas a tener que mantener en memoria
todos los cambios de roles que hiciste antes de guardar, y despues
guardarlos en la DB. Y además vas a tener que hacer un update si la persona
ya era medico, y un insert si ya era Paciente.
Otra desventaja que tiene usar Decorator es que es mas difícil para
expandirlo, por ejemplo algun dia te van a decir: "che... tengo un paciente
que empezó a laburar en la cocina, me agregas el rol?"

En fin, Decorator esta bueno y despues usarlo es mucho mas lindo, ej: podes
hacer new Medico();, pero es bastante complicado de hacerlo.

Saludos!


-----Original Message-----
From: [email protected]
[mailto:[EMAIL PROTECTED] On Behalf Of Detonador de
Sueños
Sent: Sábado, 28 de Junio de 2008 04:01 p.m.
To: NHibernate-Hispano
Subject: [NHibernate-Hispano] Mapeo de Decorator


Buenas tardes a todos.
Les planteo mi problema: Actualmente tengo una clase Persona abstracta
y luego otras clases Médico, Paciente, Clinica que heredan de Persona.
Hasta ahí todo me funciona correctamente, pero me encotré con el
problema de que un Paciente, puede ser un Médico y/o una Clínica y así
todas las combinaciones posibles.
Estuve leyendo por ahí que esto no se puede hacer con herencia y
algunos proponían hacerlo con Decorator.
Pero la verdad es que no se como arrancar.
Les dejo mi mapeo actual (no está clínica, pero tiene otras
propiedades distintas a Médicos y Pacientes), espero que me puedan
ayudar para pasarlo a Decorator o me den alguna sugerencia.

Desde ya muchas gracias
Maza, Leonardo Javier

El mapeo actual

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="SMSystem.MedLab.Models" namespace="SMSystem.MedLab.Models">
  <class name="Persona" table="Personas" abstract="true" >
    <id name="Id" type="int">
      <generator class="identity"/>
    </id>

    <property name="TipoDocumento" type="int" not-null="false"/>
    <property name="NumeroDocumento" type="int" not-null="false"/>
    <property name="ApellidoNombre" type="String" length="35" not-
null="true"/>
    <many-to-one name="Direccion" class="Direccion" foreign-
key="FK_Personas_Direcciones" fetch="join" not-null="false"/>

    <set name="Telefonos" table="PersonasTelefonos" lazy="false">
      <key column="Persona" foreign-key="FK_PersonasTelefonos_Persona"/
>
      <one-to-many class="Telefono" not-found="ignore"/>
    </set>

    <set name="Emails" table="PersonasEmails" inverse="true"
lazy="false">
      <key column="Persona" foreign-key="PersonasEmails_Persona"/>
      <one-to-many class="Email" not-found="ignore"/>
    </set>

    <!--Mapeo de médicos-->
    <joined-subclass name="Medico" table="Medicos" extends="Persona">
      <key column="Persona" foreign-key="FK_Medicos_Personas"/>

      <property name="Codigo" unique="true" not-null="true"/>
      <property name="FechaInicio" type ="DateTime" not-null="true"/>
      <property name="FechaFin" type ="DateTime" not-null="false"/>

      <set name="Zonas" table="MedicosZonas" lazy="false"
fetch="join">
        <key column="Medico" foreign-key="FK_MedicosZonas_Medico"/>
        <many-to-many class="Zona" column="Zona" fetch="join" foreign-
key="FK_MedicosZonas_Zona"/>
      </set>
    </joined-subclass>

    <!--Mapeo de Pacientes-->
    <joined-subclass name="Paciente" table="Pacientes"
extends="Persona">
      <key column="Persona" foreign-key="FK_Pacientes_Personas"/>

      <property name="Codigo" unique="true" not-null="true"/>
    </joined-subclass>

  </class>
</hibernate-mapping>


--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---

Responder a