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