¿y si usas Save o Update por separado?

2010/9/22 Nestor Rodriguez <[email protected]>:
> Me agrada que te haya servido.  Sin embargo me surge la duda acerca de lo
> que dices al final  de que "lo ideal es verificar primero que el registro no
> exista en la tabla".  Creo que esa es una verificacion que no deberias
> hacer, pues la idea de utilizar el unsave-value es precisamente informarle a
> NHibernate si debe realizar un update o un insert sin tener que ir a
> preguntar a la base de datos.
> Cuando he tenido que trabajar con identificadores asignados lo que mejor me
> ha dado resultado es el uso de un interceptor.
>  En http://www.nhforge.org/doc/nh/en/index.html en la seccion 19.1 puedes
> leer como funciona el interceptor por medio del metodo  IsTransient().
> Cuentanos como te va.
> Saludos,
> Nestor Rodriguez
>
> 2010/9/22 Google Cris <[email protected]>
>>
>> Hola que tal, yo nuevamente
>>
>> Bueno Nestor, pude solucionar el problema, revise la documentacion de
>> los puntos 5.1.4.6 y 7.4 que me mencionaste y me ayudo mucho. Muchas
>> gracias por la ayuda :D
>>
>> Ahora cuento la historia por si a alguien le da el mismo problema.
>>
>> Revise el archivo nhibernate-mapping.xsd de nhibernate, busque la
>> parte de composite-id especificamente el unsaved-value, este segun el
>> archivo me permite colocar dos valores, (none o any), con ambos probe,
>> compile el hibernate una vez hecho el cambio y aun con el
>> (SaveorUpdate) me mandaba a actualizar en vez de guardar.
>>
>> Tambien probe la opción de colocar en la estructura con id compuesto
>> el campo <version name="LastModifiedOn" column="LastModifiedOn"
>> type="timestamp" />, en este caso si me mando a guardar en vez de
>> actualizar, pero no me gustaba la idea de agregar ese campo
>> "LastModifiedOn" a mi tabla, ademas que me daba otro error de fuera de
>> indices
>>
>> :S
>>
>> "Index was out of range. Must be non-negative and less than the size
>> of the collection." al momento de
>>
>> Entonces continue la busqueda y encontre un ejemplo en el grupo con
>> esta opción:
>>
>>
>> http://groups.google.com.ar/group/nhibernate-hispano/browse_thread/thread/20171bd616889cc6/ff5ca6272c472e6c?lnk=gst&q=composite-id+guillermo#ff5ca6272c472e6c
>>
>> Con lo cual pude cambiar mi estructura a como indica Guillermo en el
>> ejemplo "TestConn.zip" y me quedo asi:
>>
>> Clase: TipoListado
>>
>>
>> <?xml version="1.0" encoding="utf-8" ?>
>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>> namespace="PDVSA.Negocio.Entidades.Base"
>> assembly="Entidades.Base"
>> default-lazy="true">
>>  <meta
>> attribute="extends">PDVSA.Business.Entities.Core.AbstractEntity</meta>
>>  <meta attribute="extends-
>> composite">PDVSA.Business.Entities.Core.CompositeID</meta>
>>  <meta attribute="generate-typeconverter"></meta>
>>
>>  <class name="PDVSA.Negocio.Entidades.Base.TipoListado,
>> Entidades.Base" table="T_TipoListado">
>>
>>    <composite-id unsaved-value="any">
>>      <key-property name="PK_CodigoTipoListado"
>> column="PK_CodigoTipoListado"  type="Int64" />
>>      <key-property name="PK_CodigoListado" column="PK_CodigoListado"
>> type="Int64" />
>>    </composite-id>
>>
>>    <property name="DescripcionTipoListado"
>> column="DescripcionTipoListado" type="String" length="100">
>>      <meta attribute="field-browsable">true</meta>
>>      <meta attribute="field-readonly">false</meta>
>>      <meta attribute="field-category">GeneralCategory</meta>
>>      <meta attribute="field-propertysort">3</meta>
>>    </property>
>>
>>  </class>
>>
>> </hibernate-mapping>
>>
>> -------------------------------------
>>
>> Clase: Listado
>>
>> <?xml version="1.0" encoding="utf-8" ?>
>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>> namespace="PDVSA.Negocio.Entidades.Base"
>> assembly="Entidades.Base"
>> default-lazy="true">
>>   <class name="PDVSA.Negocio.Entidades.Base.Listado"
>> table="T_Listado">
>>
>>      <meta
>> attribute="extends">PDVSA.Business.Entities.Core.AbstractEntity</meta>
>>      <meta attribute="default-property-tostring">DescripcionListado</
>> meta>
>>      <meta attribute ="generate-typeconverter"></meta>
>>
>>      <id name="ID" column="PK_CodigoListado" type="Int64" unsaved-
>> value="0">
>>        <meta attribute="field-browsable">false</meta>
>>        <meta attribute="field-readonly">true</meta>
>>        <meta attribute="field-category">GeneralCategory</meta>
>>        <meta attribute="field-propertysort">1</meta>
>>        <generator class="sequence">
>>           <param name="sequence">T_Listado_PK_CodigoListado_seq</param>
>>        </generator>
>>      </id>
>>
>>      <property name="DescripcionListado" column="DescripcionListado"
>> type="String" length="100">
>>        <meta attribute="field-browsable">true</meta>
>>        <meta attribute="field-readonly">false</meta>
>>        <meta attribute="field-category">GeneralCategory</meta>
>>        <meta attribute="field-propertysort">2</meta>
>>      </property>
>>
>>      <bag name="TipoListados" table="T_TipoListado" inverse="true">
>>        <key foreign-key="PK_CodigoListado" column="PK_CodigoListado"/
>> >
>>        <one-to-many class="PDVSA.Negocio.Entidades.Base.TipoListado,
>> Entidades.Base" />
>>      </bag>
>>
>>  </class>
>> </hibernate-mapping>
>>
>> Teniendo en cuenta unsaved-value="any" en el composite-id  de la clase
>> TipoListado
>>
>> Genere la base de datos e inclui algunos datos en T_Listado
>>
>> Hice una prueba de inserción bastante simple y funciono:
>>
>> // PRUEBA SIMPLE PARA AGREGAR AL COMPOSITE-ID
>> Listado clsListado = sessionContext.GetById<Listado>((long)1);
>> TipoListado clsTipoListado = new TipoListado();
>> clsTipoListado.PK_CodigoListado = clsListado.ID;
>> clsTipoListado.PK_CodigoTipoListado = 63;
>> clsTipoListado.DescripcionTipoListado = "prueba";
>> sessionContext.SaveOrUpdate<TipoListado>(clsTipoListado);
>>
>> Claramente para insertar un valor nuevo, lo ideal es verificar primero
>> que el registro no exista en la tabla de la base de datos, pues en
>> este caso se haria una actualización en vez de una inserción.
>>
>> Gracias por la ayuda :)
>>
>> --
>> 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