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 -~----------~----~----~----~------~----~------~--~---
