Modelar relación padre/hijo con un solo hijo

8 views
Skip to first unread message

JLB

unread,
Oct 31, 2007, 6:07:31 AM10/31/07
to NHibernate-Hispano
Hola a todos:
Mi consulta es acerca de las relaciones padre/hijo pero que sólo
admitan un hijo. Para hacer esto se utiliza en el mapeo del padre un
elemento "one-to-one" (hacia el hijo) y en el mapeo del padre un
elemento de tipo "many-to-one" (hacia el padre). En el mapeo one-to-
one se incluye la propiedad "cascade" para hacer la inserción y
actualización desde el objeto padre hacia el hijo.
El problema surge cuando se quiere "desreferenciar" un hijo del
padre y el comportamiento que se quiere obtener es el mismo que se
produce en una colección con un "cascade-all-delete-orphan": que al
eliminar la referencia en el hijo del padre y eliminar la instancia
del padre del hijo, al pasar el objeto padre por un "SaveOrUpdate()"
automáticamente se elimine el hijo que ha quedado huerfano.
No sé si esto no es posible o si sería posible implementar este
comportamiento realizando otro tipo de mapeos. En cualquier caso
agradezco cualquier pauta, sugerencia o ejemplo que puedan
proporcionarme.
Gracias y un cordial saludo.
Juan Luis Bernáldez

Dario Quintana

unread,
Nov 1, 2007, 10:41:35 PM11/1/07
to NHibernat...@googlegroups.com
Hola, ya pasaron unos dias y no sé si lo resolviste,

Acá te paso un link para que lo vayas mirando y puede servir:
http://sdesmedt.wordpress.com/2006/07/24/nhibernate-part-3-mapping-techniques-for-aggregation-one-to-one-mapping/

No me queda muy claro: en un tema de 1 a 1,  cual es la actuación de un "padre" y un many to one ?

saludos

JLB

unread,
Nov 5, 2007, 7:39:03 AM11/5/07
to NHibernate-Hispano
Hola de nuevo a todos:
Dario, gracias por tu interés. La forma que se tiene para denotar
la relación padre/hijo es usar en el mapeo del hijo la relación "many-
to-one" y en el mapeo del padre cualquier elemento que denote una
colección (bien sea "bag", "set", "list"...), cuando estamos en un
caso bidireccional como en el que yo me encuentro. De ahí que indique
el mapeo en el hijo del padre como una "many-to-one".
En tablas, sería:
Tabla
Padre
Tabla Hijo
----------------------
--------------------------------

ID_PADRE
ID_HIJO (Primary Key)

ID_PADRE (Foreign Key)

El problema está en que yo también veo esa relación padre/hijo
cuando quieres que sea un caso en el que el padre sólo pueda tener un
único hijo. En este caso yo había pensado modelar el mapeo del hijo
como una "many-to-one" y el mapeo del padre hacia el hijo como una
"one-to-one". Esto es posible hacerlo y no hay ningún problema, salvo
que quieras tener un comportamiento de tipo "delete-orphan". Aquí es
donde surge el problema de usar la relación de tipo "one-to-one",
porque yo esperaba que al borrar el hijo del padre y la relación del
padre en el hijo, al hacer "SaveOrUpdate()" sobre el objeto padre se
eliminaran los elementos huérfanos (en este caso el hijo del que
estamos hablando). Pero no es así, y al hacer eso desde el código no
se borran dichos elementos, quedándote el elemento en la base de
datos. Se me ha ocurrido una forma de hacerlo, consistiría en usar una
lista en una variable pública que sería la que se mapeara en el xml
del padre, usando una propiedad pública para devolver siempre el
primer elemento de esa lista. Haciendo esto se conseguiría el
proposito de tener una relación padre/hijo con un solo hijo, pero la
verdad es que complica el "set" de la propiedad donde se accede al
hijo y la verdad que tampoco me parece muy elegante. Llevo dándole
vueltas unos días y escribía al foro a ver si alguien podría
vislumbrar otra solución o simplemente apuntarme qué error estoy
cometiendo porque creo que me estoy obcecando demasiado en el
planteamiento que tengo actualmente.
Si necesitáis algún tipo de información hacédmelo saber.

Gracias por vuestro interés y un cordial saludo.

Juan Luis

Dario Quintana ha escrito:

> --
> Dario Quintana
> http://darioquintana.com.ar/blogging

Reply all
Reply to author
Forward
0 new messages