¿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
