Jose, siguiendo tu ejemplo
------
var retencion = new Retencion() ;
var factura = new factura() { Retencion = retencion } ;
retencion.FacturaAplicada = factura ********
session.save(factura);
-----
Este session.save(retencion);
No recuerdo donde leí, pero sugerían para las relaciones 1 a 1, utilizar
many-to-one a one-to-one, ahora veo con tu comentario
que esto no puedo generalizarlo.
Me encuentro examinando el utilizar one-to-one, por otro lado estaba leyendo
un poco de esta propiedad
------
not-found (optional - defaults to exception): Specifies how foreign keys
that reference missing rows will be handled: ignore will treat a missing row
as a null association.
-----
Expongo nuevamente los mappings y clases
public class Factura
{
.......
public virtual RetencionFuenteVenta Retencion { get; set; }
.......
}
public class RetencionFuenteVenta
{
........
public virtual Factura FacturaAplicada { get; set; }
......
}
Mis mappings
<class name="RetencionFuenteVenta">
<id name="Id">
<generator class="hilo"/>
</id>
.........
<many-to-one name="FacturaAplicada" class="Factura" column="FacturaId" />
</class>
<class name="Factura">
<id name="Id">
<generator class="hilo"/>
</id>
<many-to-one name="Retencion" class="RetencionFuenteVenta"
column="RetencionId" cascade="all" />
</class>
Saludos
Edgar
El 28 de junio de 2011 15:28, José F. Romaniello
<[email protected]>escribió:
> No tiene que ver lo que Fabio subió con esto Angel, lo que Fabio subió es
> para que cuando tenes un one-to-many ( en el ejemplo de Edgar no hay ninguno
> ) unidireccional (sin su many-to-one) solo se haga insert sin el update que
> antes nhibernate hacía.
>
> Estoy casi seguro que el problema de Edgar se debe a que no cumple la
> segunda regla de ORM; "consistencia en memoria",
> si vos guardas
>
> var retencion = new Retencion() ;
> var factura = new factura() { Retencion = retencion } ;
> session.save(factura);
> session.save(retencion);
>
> va a fallar. Tiene que estar apuntado desde los dos lugares, para que haga
> todo de una... y probablemente necesites cascade="all"
>
> Para mantener el encapsulamiento, te sugiero utilizar un custom setter en
> alguna de las dos propiedades.
>
> Y preguntate si lo que necesitas no es una one-to-one en lugar de una
> many-to-one ;)
>
>
>
>
>
> El 28 de junio de 2011 17:16, Angel Java Lopez
> <[email protected]>escribió:
>
> Hola gente!
>>
>> Hmm... Edgar, el requerimiento de FacturaId como nullable, parece
>> relacionado con:
>>
>> http://msmvps.com/blogs/lopez/archive/2011/05/23/nhibernate_2D00_3_2D00_part_2D00_6_2D00_one_2D00_to_2D00_many_2D00_with_2D00_many_2D00_to_2D00_one.aspx
>>
>> donde se envian dos comandos (INSERT y UPDATE) por cada entidad "hija". Y
>> que el campo BookId queda con valor nulo en el insert. La doc de NHibernate
>> indica que tiene que ser nullable, pero no queda muy claro por que.
>>
>> En
>>
>> http://msmvps.com/blogs/lopez/archive/2011/05/30/nhibernate_2D00_3_2D00_part_2D00_7_2D00_one_2D00_to_2D00_many_2D00_with_2D00_inverse.aspx
>> desaparecio el problema con un atribute inverse, pero no se si se aplica a
>> tu caso.
>>
>> Entiendo que hace una semana, Fabio Maulo envio al trunk codigo que evita
>> el INSERT y el UPDATE, y hace solo Update. Con lo que la necesidad de tener
>> BookId (O FacturaId en tu caso) como nullable, ya no es mas.
>>
>> Nos leemos!
>>
>> Angel "Java" Lopez
>> http://www.ajlopez.com
>> http://twitter.com/ajlopez
>>
>>
>> 2011/6/28 Edgar Ramos <[email protected]>
>>
>>> Nestor lo habia probado como not-null="false" y el error era el mismo. y
>>> de hecho mo lo decia antes sin cambiar nada en mis mappings y unicamente
>>> habilitando "FacturaId" como null = "true" funciona muy bien.
>>>
>>> La pregunta que se me plantea es si dejo tal cual como esta funcionando
>>> "FacturaId" como null = "true", y los mappings sin tocarlos, es correcto lo
>>> que estoy haciendo, la verdad me confundi un poco
>>>
>>> Saludos
>>>
>>> Edgar
>>>
>>> El esquema no lo genero con SchemaExport,
>>>
>>> El 28 de junio de 2011 14:25, Nestor Andres Rodriguez <
>>> [email protected]> escribió:
>>>
>>> De todas maneras debes agregar el not-null = "false" en <many-to-one
>>>> name="FacturaAplicada" class="Factura" column="FacturaId" not-null =
>>>> "false"/>.
>>>>
>>>> Umm ... siempre me confundo con el not-null = "true/false" diria que
>>>> seria mas intuitivo si dijera nullable="true/false"... En fin prueba y me
>>>> cuentas.
>>>>
>>>> En caso de que no estes generando el esquema con el SchemaExport
>>>> entonces debes correr un script en la BD que cambie la llave foranea
>>>> "FacturaId" como null = "true".
>>>> Saludos,
>>>> Nestor Rodriguez
>>>> 2011/6/28 Nestor Andres Rodriguez <[email protected]>
>>>>
>>>>> Estas generando el script desde NH con SchemaExport ?
>>>>>
>>>>>
>>>>> 2011/6/28 Edgar Ramos <[email protected]>
>>>>>
>>>>>> Gente un Saludo
>>>>>>
>>>>>> Me he liado un poco con la relacion de estos objetos
>>>>>>
>>>>>> Factura y Retencion
>>>>>>
>>>>>> A una Factura le corresponde una retencion, siempre y cuando el
>>>>>> cliente lo exija, caso contrario no aplica, para este efecto
>>>>>>
>>>>>>
>>>>>> Mis clases
>>>>>>
>>>>>> public class Factura
>>>>>> {
>>>>>> .......
>>>>>> public virtual RetencionFuenteVenta Retencion { get; set; }
>>>>>> .......
>>>>>> }
>>>>>>
>>>>>> public class RetencionFuenteVenta
>>>>>> {
>>>>>> ........
>>>>>> public virtual Factura FacturaAplicada { get; set; }
>>>>>> ......
>>>>>> }
>>>>>>
>>>>>> Mis mappings
>>>>>>
>>>>>> <class name="RetencionFuenteVenta">
>>>>>> <id name="Id">
>>>>>> <generator class="hilo"/>
>>>>>> </id>
>>>>>>
>>>>>> .........
>>>>>> <many-to-one name="FacturaAplicada" class="Factura"
>>>>>> column="FacturaId" />
>>>>>> </class>
>>>>>>
>>>>>> <class name="Factura">
>>>>>> <id name="Id">
>>>>>> <generator class="hilo"/>
>>>>>> </id>
>>>>>>
>>>>>> <many-to-one name="Retencion" class="RetencionFuenteVenta"
>>>>>> column="RetencionId" cascade="all" />
>>>>>> </class>
>>>>>>
>>>>>> En el esquema de la bdd, la tabla Factura tiene el campo RetencionId
>>>>>> como permitir valores nulos, que para mi
>>>>>> caso es lo que requiero.
>>>>>> Por otro lado La tabla RetencionFuenteVenta, campo FacturaId, tiene
>>>>>> tambien permitir valores nulos, no me parece
>>>>>> que sea lo correcto, pero lo puesto asi para que nh persista estas
>>>>>> entidades y lo hace sin problemas
>>>>>>
>>>>>> Pero al quitar de RetencionFuenteVenta, campo FacturaID el permitir
>>>>>> valores nulos, nh me tira un error
>>>>>> -------------------------------
>>>>>> {"No se puede insertar el valor NULL en la columna 'FacturaID', tabla
>>>>>> 'RetencionFuenteVenta'. La columna no admite valores NULL. INSERT
>>>>>> falla.\r\n
>>>>>> Se terminó la instrucción."}
>>>>>> ---------------------------------
>>>>>>
>>>>>> Cualquier comentario o sugerencia les estoy muy agradecido
>>>>>>
>>>>>> Saludos
>>>>>>
>>>>>> Edgar
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> 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
>>>
>>
>> --
>> 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