Hola Edgar,

Para relaciones bidireccionales uno-a-uno tienes dos opciones como dijo
Jose.  Una es a travez de UNA llave foranea y la otra es a travez de llaves
primarias.

1.  Para mepear a travez de UNA unica llave foranea (no dos como tienes en
este momento).  Requieres un many-to-one en la clase que mapea a la tabla
con la llave foranea, en este caso podria ser Retencion.  Y un one-to-one en
la tabla que NO tiene la llave foranea, en este caso seria Factura.
ejemplo:


   - En el mapeo de Retencion:  <many-to-one name="Retencion"
   class="RetencionFuenteVenta" column="RetencionId" cascade="all"
   unique="true"/>  (unique=true para asegurar que unicamente puede haber una
   retencion por factura, esto asegura la relacion uno-a-uno.  El unique
   funciona solo para generar el esquema, si tu lo generas entonces debes
   agregar un constraint en la BD para asegurar que el campo
   Retenion->FacturaId es unico)
   - En el mapeo de Factura: <one-to-one name="FacturaAplicada"
   class="Factura" /> (En la tabla factura ya no existiria una llave foranea a
   Retencion).

2. Para mapear a travez de llaves primarias ( cuyo objetivo es que ambas
entidades siempre tengan el mismo ID), se hace SIN llaves foraneas y en
ambos mapeos de Retencion y Factura debes colocar un <one-to-one> pero debes
escoger cual de las dos clases es la que maneja el ID y la "esclava" se
mapea como dijo Jose, utilizando en el <generator name="foreign"> ... con
parametros adicionales.  Creo que esta no se acomoda a tu situacion asi que
utiliza la opcion de llaves foraneas.  De todas maneras para mayor
informacion ve a este
link<http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone>
En conclusion te sobra una llave foranea y debes remplazar en alguno de los
dos lados un <many-to-one> por un <one-to-one/>.

Saludos,
Nestor Andres Rodriguez


2011/6/28 Edgar Ramos <[email protected]>

> Jose
>
> Hice algunos cambios sugeridos, pero sigo igual .
> Con las clases que expuse en el mensaje anterior. y tomando en cuenta que
> Factura tiene una relacion 0..1 a Retencion y a su vez Retencion tiene 1..1
> a Factura, pretendia que a nivel de BDD, me quedara algo como esto
>
> Factura
> ID      RetencionID
> 100   null
> 101   200
> 102   null
> 103   300
>
> Retencion
> ID     FacturaID
> 200  101
> 300   103
>
> En la tabla Retencion tenia FacturaID como null= false, y nh me tiraba el
> error comentado, dejandolo como null=true, nh
> persiste sin problemas, pero como comentaba Nestor,
> Creo que voy a eliminar de la Tabla Retencion, la columna FacturaID, me
> parece mejor esta solucion que, dejar null=true,
> el campo FacturaID, aunque nh lo persista bien
>
> Nuevamente sus comentarios y sugerencias son bienvenidos
>
> Saludos
> Edgar
>
>
>
>
>
> El 28 de junio de 2011 17:15, José F. Romaniello 
> <[email protected]>escribió:
>
> nhibernate tiene dos formas de manejar un one-to-one en la bd;
>>
>>    - facturaId en la tabla retención es una columna unique
>>    - facturaid es la clave primaria de retención. En el generator del id
>>    de retención se utiliza "foreign"
>>
>>
>> El 28 de junio de 2011 19:12, José F. Romaniello 
>> <[email protected]>escribió:
>>
>> entonces retencion => factura es one-to-one.
>>>
>>> El 28 de junio de 2011 19:05, Edgar Ramos <[email protected]>escribió:
>>>
>>> Me parece que estoy obviando que para mi caso, una Factura tiene 0..1
>>>> Retencion, y una Retencion tiene una y solo una Factura asociada
>>>
>>>
>>>
>>   --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

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