Extraído de la documentación de referencia de NHibernate:

>For databases which support identity columns (DB2, MySQL, Sybase, MS SQL), you 
>may use identity key generation. For databases that support sequences >(DB2, 
>Oracle, PostgreSQL, Interbase, McKoi, SAP DB) you may use sequence style key 
>generation. Both these strategies require two SQL queries to insert a >new 
>object.

A qué dos instrucciones SQL  para la inserción se refiere? Yo hago
esto:

transaction = session.BeginTransaction();
                session.Save(identName);
                transaction.Commit();
                session.Disconnect();

Sospecho que me falta una instrucción.

On 4 feb, 17:06, "Chili" <[EMAIL PROTECTED]> wrote:
> >En cuanto al error, estas seguro que la base de datos tiene una propiedad
> >identity en la primary key?
>
> Sí, estoy utilizando SQL Server, y si no me equivoco, soporta identity
> en el primary key.
>
> > por ahi es importante
> > tambien  la exception class, o sea, si es SqlException,  u otra. Por otro
> > lado las excepciones de nhib y mas qeu nada cuando son de parsing del hbm
> > suele ser mucho mas importante la innerException.
>
> La excepción es una NHibernate.ADOException, y el mensaje es:
>
> {"could not insert:
> [dataAccess.csfiles.datospersonalesygrupo.IdentNameDA][SQL: INSERT
> INTO identname (name) VALUES (?)]"}
>
> La innerException es de tipo System.Data.SqlClient.SqlException y el
> mensaje es:
>
> {"Cannot insert the value NULL into column 'idName', table
> 'curriculum.dbo.identname'; column does not allow nulls. INSERT fails.
> \r\nThe statement has been terminated."}
>
> On 3 feb, 20:28, GLM.net <[EMAIL PROTECTED]> wrote:
>
> > NHibernate soporta grabar los hijos al grabar los padres, pero cuando los
> > hijos no son entity sino por ejemplo un bag de composite-elements.
>
> > No tengo mucha experiencia en recomendar algo, pero lo soporta :D
>
> > Es el mismo caso de los emails..
> > vos podrias haber usado "element" en vez de composite-element, el segundo te
> > da mas posibilidades para agregarle mas columnas, usar tu propia
> > clase, relacioens, etc.
>
> > En cuanto al error, estas seguro que la base de datos tiene una propiedad
> > identity en la primary key?
> > Una herramienta muy util es siempre ver qeu query esta haciendo nhibernate.
> > Yo suelo usar profiler de sql server, porque siempre uso sql server, pero se
> > que nhib tiene metodos para ver los queryes que ejecuta. A veces la solucion
> > esta ahi.
>
> > "me da el error de que no se puede insertar null" por ahi es importante
> > tambien  la exception class, o sea, si es SqlException,  u otra. Por otro
> > lado las excepciones de nhib y mas qeu nada cuando son de parsing del hbm
> > suele ser mucho mas importante la innerException.
>
> > Saludos
>
> > On 2/3/07, Chili <[EMAIL PROTECTED]> wrote:
>
> > > De acuerdo, mi duda era porque creía que quizá NHibernate podría
> > > arrastrar en los objetos padre a los objetos hijo y guardarlos todos a
> > > la vez.
>
> > > Ahora otra pequeña duda. Estoy intentando grabar los hijos, y tengo un
> > > problema con las claves.
>
> > > En la clave primaria de IdentNameDA tengo <generator class="identity" /
> > > > y unsaved-value="0". Ahora estoy intentando mandar un objeto con su
> > > id a cero, para que NHibernate sepa que es un objeto nuevo, y por
> > > tanto proceda a guardarlo en la bd. Con el generator identity tengo
> > > entendido (por lo que he leído) que el propio NHibernate genera las
> > > claves, por lo tanto no debería hacer nada más. No obstante, me da
> > > error porque me dice que no se pueden insertar Null en la clave
> > > primaria (obvio!!!). Os pongo el código y todo:
>
> > > <?xml version="1.0" encoding="utf-8" ?>
> > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-
> > > lazy="false">
> > > <class name="dataAccess.csfiles.datospersonalesygrupo.IdentNameDA,
> > > dataAccess" table="identname">
> > >    <id name="IdName" column="idname" type="Int32" unsaved-value="0">
> > >      <generator class="identity" />
> > >    </id>
> > >    <property name="Name" column="name" type="String"/>
> > > </class>
> > > </hibernate-mapping>
>
> > > namespace dataAccess.csfiles.datospersonalesygrupo
> > > {
> > >    public class IdentNameDA
> > >    {
> > >        private int idname;
> > >        private string name;
>
> > >        public int IdName {
> > >            get {
> > >                return idname;
> > >            }
> > >            set {
> > >                idname = value;
> > >            }
> > >        }
>
> > >        public string Name {
> > >            get {
> > >                return name;
> > >            }
> > >            set {
> > >                name = value;
> > >            }
> > >        }
> > >    }
> > > }
>
> > > Lo creo y relleno su campo name:
>
> > >            IdentNameDA identName = new IdentNameDA();
> > >            identName.Name = (string)r["Documento"];
> > >            identName.IdName =
> > > Controlador.Instance.getIdentNameId(identName.Name); // Aquí no
> > > encuentra nada, por lo que va con idName a cero. Ya lo he //comprabado
> > > depurando.
>
> > > Aquí lo guardo:
>
> > >        public void saveIdentName(IdentNameDA identName) {
> > >            if (!session.IsConnected)
> > >                session.Reconnect();
>
> > >            ITransaction transaction = null;
>
> > >            try
> > >            {
> > >                transaction = session.BeginTransaction();
> > >                session.SaveOrUpdate(identName);
> > >                transaction.Commit();
> > >                session.Disconnect();
> > >            }
> > >            catch (Exception e)
> > >            {
> > >                transaction.Rollback();
> > >                session.Disconnect();
> > >                throw e;
> > >            }
> > >        }
>
> > > On 3 feb, 18:06, "Dario Quintana" <[EMAIL PROTECTED]>
> > > wrote:
> > > > Respondo ràpido:
>
> > > > estás queriendo guardar el hijo, pero no tenes guardado el padre.
> > > > Estás haciendo
>
> > > > myOrderItem.Order = myOrder;
> > > > Save(myOrderItem);
>
> > > > Antes tendrías que hacer Save(myOrder);
>
> > > > Save(myOrder);
> > > > myOrderItem.Order = myOrder;
> > > > Save(myOrderItem);
>
> > > > fijate si es eso.
>
> > > > On 2/3/07, Chili <[EMAIL PROTECTED]> wrote:
>
> > > > > Hola a todos,
>
> > > > > Os presento un nuevo problema. Estoy intentando salvar un nuevo objeto
> > > > > a mi base de datos. El problema es que es un objeto "hijo", q va
> > > > > dentro de otro objeto padre. Es decir, la estrucura sería así:
>
> > > > > DatosPersonalesDA tiene una colección de objetos IdentDA, y éste a su
> > > > > vez tiene una many-to-one a un objeto de tipo IdentNameDA.
>
> > > > > Os pongo la parte de los mapping relevantes de estos tres archivos.
>
> > > > > <?xml version="1.0" encoding="utf-8" ?>
> > > > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-
> > > > > lazy="false">
> > > > >   <class
> > > > > name="dataAccess.csfiles.datospersonalesygrupo.DatosPersonalesDA,
> > > > > dataAccess" table="datospersonales">
> > > > >     <id name="IdPersonales" column="idpersonales">
> > > > >       <generator class="assigned" />
> > > > >     </id>
> > > > >     <bag name="Idents" table="idents">
> > > > >       <key column="idpersonales" />
> > > > >       <composite-element
> > > > > class="dataAccess.csfiles.datospersonalesygrupo.IdentsDA, dataAccess">
> > > > >         <property name="Number" column="number" type="String"/>
> > > > >         <property name="Place" column="place" type="String"/>
> > > > >         <property name="Date" column="date"/>
> > > > >         <many-to-one name="Name" cascade="save-update"
> > > > >           class="dataAccess.csfiles.datospersonalesygrupo.IdentNameDA,
> > > > > dataAccess"
> > > > >           column="idname"/>
> > > > >       </composite-element>
> > > > >     </bag>
> > > > >   </class>
> > > > > </hibernate-mapping>
>
> > > > > <?xml version="1.0" encoding="utf-8" ?>
> > > > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-
> > > > > lazy="false">
> > > > >   <class name="dataAccess.csfiles.datospersonalesygrupo.IdentNameDA,
> > > > > dataAccess" table="identname">
> > > > >     <id name="IdName" column="idname" type="Int32" unsaved-value="0">
> > > > >       <generator class="identity" />
> > > > >     </id>
> > > > >     <property name="Name" column="name" type="String"/>
> > > > >   </class>
> > > > > </hibernate-mapping>
>
> > > > > Ahora os pongo los cs:
>
> > > > > namespace dataAccess.csfiles.datospersonalesygrupo
> > > > > {
> > > > >     public class DatosPersonalesDA
> > > > >     {
> > > > >         private int idPersonales;
> > > > >         private IList<IdentsDA> idents;
> > > > > }
> > > > > }
>
> > > > > namespace dataAccess.csfiles.datospersonalesygrupo
> > > > > {
> > > > >     public class IdentsDA
> > > > >     {
> > > > >         private string place, number;
> > > > >         private DateTime date;
> > > > >         private IdentNameDA name;
> > > > > }
> > > > > }
>
> > > > > namespace dataAccess.csfiles.datospersonalesygrupo
> > > > > {
> > > > >     public class IdentNameDA
> > > > >     {
> > > > >         private int idname;
> > > > >         private string name;
> > > > > }
> > > > > }
>
> > > > > Al borrar un determinado objeto IdentDA o modificar uno ya existente
> > > > > no tengo ningún problema, pero al borrarlo y actualizar la clase padre
> > > > > me casca aquí:
>
> > > > > try
> > > > >             {
> > > > >                 transaction = session.BeginTransaction();
> > > > >                 session.SaveOrUpdate(member);
> > > > >                 transaction.Commit();
> > > > >                 session.Disconnect();
> > > > >             }
>
> > > > >  object references an unsaved transient instance - save the transient
> > > > > instance before flushing:
> > > > > dataAccess.csfiles.datospersonalesygrupo.IdentNameDA
> > > > > Description: An unhandled exception occurred during the execution of
> > > > > the current web request. Please review the stack trace for more
> > > > > information about the error and where it originated in the code.
>
> > > > > Exception Details: NHibernate.TransientObjectException: object
> > > > > references an unsaved transient instance - save the transient instance
> > > > > before flushing: dataAccess.csfiles.datospersonalesygrupo.IdentNameDA
>
> > > > > Stack Trace:
>
> > > > > [TransientObjectException: object references an unsaved transient
> > > > > instance - save the transient instance before flushing:
> > > > > dataAccess.csfiles.datospersonalesygrupo.IdentNameDA]
> > > > >    dataAccess.csfiles.DBManager.saveMember(MemberDA member) in C:
> > > > > \Documents and Settings\César Díaz García\Mis documentos\Visual Studio
> > > > > 2005\Projects\dataAccess\dataAccess\DBManager.cs:97
> > > > >    Controlador.saveMember(MemberDA member) in c:\Documents and
> > > Settings
> > > > > \César Díaz García\Mis documentos\Visual Studio 2005\WebSites\proyecto
> > > > > \App_Code\Controlador.cs:58
>
> ...
>
> leer más »


--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups-beta.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---

Responder a