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
> > >    web_privado_perfil_modificar.ButtonGuardar_Click(Object sender,
> > > EventArgs e) in c:\Documents and Settings\César Díaz García\Mis
> > > documentos\Visual Studio 2005\WebSites\proyecto\web\privado
> > > \perfil_modificar.aspx.cs:104
> > >    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +96
> > >    System.Web.UI.WebControls.Button.RaisePostBackEvent(String
> > > eventArgument) +116
> >
> > >
> System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
> (String
> > > eventArgument) +31
> > >    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
> > > sourceControl, String eventArgument) +32
> > >    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
> > > +72
> > >    System.Web.UI.Page.ProcessRequestMain(Boolean
> > > includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
> > > +3834
> >
> > --
> > Dario Quintanahttp://blog.darioquintana.com.ar
>
>
> >
>


-- 
GLM
MCAD / MCP - Argentina
www.glmnet.com.ar

--~--~---------~--~----~------------~-------~--~----~
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