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