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


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