El uso de <any> no es muy aconsejable.
Yo lo estoy usando porque estoy en un "entorno enchufable" y,
lamentablemente, no se cuantas clases llegan a implementar una
determinada interfaz/template. La otra técnica que podía haber usado
(yo) era <joined-subclass> el tema es que el riesgo de tener SQL con
join interminables es demasiado alto y algunos use-case se hubieran
vuelto demasiado lento. Por eso opté por usar <any>.
En tu caso podrías usar simplemente <joined-subclass> mapeando como
<class> el template de ITitularTelefono.
Sin meterme en la análisis de tu domain voy al tema del any.
ITitularTelefono no necesita las dos propiedades que definiste, o por lo
menos no la necesita NH.
ITitularTelefono es "afar tuyo". Intento explicarme mejor:
public interface ITitularTelefono
{
string Denominación {get;}
}
Las clases que implementan esa interfaz, según tu analisis, son:
Persona,Empresa,Domicilio.
La clase telefono queda como la hiciste:
class Telefono
{
int Numero;
ITitularTelefono Titular;
}
A Telefono.Titular le asignas una instancia de una de las clases que
implementan ITitularTelefono.
El mapping de Telefono, justo lo que no enviaste, sería por ejemplo:
<class name="Telefono" table="Telefonos">
<id name="Id" type="int">
<generator class="native"/>
</id>
<property name="Numero" type="int"/>
<any name ="Titular" id-type="int">
<column name="TitularType" length="500"/>
<column name="TitularId"/>
</any>
</class>
Con este tipo de mapeo NH graba en el campo TitularType el valor de
typeof(Telefono.Titular).AssemblyQualifiedName (que tiene que ser
mapeada y persistida ante) y su id.
Otra posibilidad es:
<class name="Telefono" table="Telefonos">
<id name="Id" type="int">
<generator class="native"/>
</id>
<property name="Numero" type="int"/>
<any name ="Titular" id-type="int" meta-type="string">
<meta-value value ="PR" class="Persona, Domain"/>
<meta-value value ="DM" class="Domicilio, Domain"/>
<meta-value value ="EM" class="Empresa, Domain"/>
<column name="TitularType" length="2"/>
<column name="TitularId"/>
</any>
</class>
En este segundo caso el campo TitularType será un campo de dos
caracteres donde NH guardará, según el typeof(Telefono.Titular), los
valores "PR" o "DM" o "EM".
Si queres conocer todos los Telefono asociados a un ITitularTelefono una
HQL seria:
select tl from Telefono tl where tl.Titular.class= :pClase and
tl.Titular.id= :pId
el parametro pClase podes asignarlo con, por ejemplo:
SetParameter("pClase",typeof(Persona))
La HQL mas probable que uses seria:
select tl from Telefono tl where tl.Titular= :pTitular
el parametro pTitular podes asignarlo con, por ejemplo:
SetEntity("pTitular", unaInstanciaDePersona)
De todas formas volvé a mirar bien tu dominio proyecta bien las clases y
verás que no necesitas usar <any>.
En la vida real un Telefono tiene que ser asociado a un titular, no
existe un numero telefónico si no se sabe quien va a pagar; si el
teléfono es fijo también tiene que ser instalado en un domicilio.
Que sea mobil o fijo hay que conocer el domicilio de facturación (que
puede ser distinto del domicilio de instalación).
Si es un teléfono mobil el unico domicilio que interesa es lo donde
enviar la factura al titular (domicilio de facturación).
Piensa en los objetos y luego ocupate de como mapearlos.
Bye.
Fabio.
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups-beta.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---