SlideShare a Scribd company logo
1 of 20
Persistencia de un Modelo de Objetos “ persistencia : capacidad de almacenar y recuperar el estado de los objetos, de forma que sobrevivan a los procesos que los manipulan” UTN – Jorge Ercoli (Docente TSSI)
Formas de persistir un objeto ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Arquitectura basada en Capas ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Modelado de capa lógica ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Resumiendo : En  TS  no hacemos un diseño OO, simplemente escribimos métodos por c/solicitud de la IU y los encapsulamos en 1 ó + clases.  En  DM  diseñamos una aplicación OO donde podemos aplicar todo tipo de asociaciones entre objetos (entre ellas la herencia).
Arquitectura de la capa de persistencia ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Capa de persistencia, continuación ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Integración de técnicas de capa lógica con persistencia ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Domain Model con Data Mapper =  ORM  ( object relational mapping ) ,[object Object],[object Object],Un ejemplo de ORM: “Nhibernate”, versión del Hibernate para .NET NHibernate
Un ORM como Hibernate implica: ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Ejemplo: ....... Venta v=sesion.Load(typeof(Venta), idventa); v.Lineas.Add(nuevaLinea); v.Cliente.Saldo=v.Cliente.Saldo + nuevaLinea.Total; Transaccion.Commit();
Nhibernate – El proceso de desarrollo ,[object Object],[object Object],[object Object],[object Object],[object Object]
Creamos las clases y las tablas (1 y 2)
Hacemos el mapping   (3) <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?>  <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.0&quot; default-access=&quot;property&quot;> <class name=&quot;TPVBO.Venta, TPVBO&quot; table=&quot;Venta&quot; > <id name=&quot;VentaID&quot; column=&quot;idVenta&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Fecha&quot; type = &quot;DateTime&quot; /> <property name=&quot;Numero&quot; type = &quot;Int32&quot; /> <bag name=&quot;LineaVenta&quot; cascade=&quot;all&quot;> <key column=&quot;venta&quot;/> <one-to-many class=&quot;TPVBO.LineaVenta, TPVBO&quot;/> </bag> </class> </hibernate-mapping> Venta.hbm.xml ................... <class name=&quot;TPVBO.LineaVenta, TPVBO&quot; table=&quot;lineaventa&quot; > <id name=&quot;LineaVentaID&quot; column=“idLineaVta&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Cantidad&quot; type = &quot;Int32&quot; /> <many-to-one name=“Producto&quot; class=&quot;TPVBO.Producto, TPVBO&quot; column=&quot;producto&quot; /> </class> </hibernate-mapping> LineaVenta. hbm.xml
Creamos el archivo de configuración (4) <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot;  type=&quot;System.Configuration.NameValueSectionHandler, System,  Version=1.0.5000.0,Culture=neutral,  PublicKeyToken=b77a5c561934e089&quot;  /> </configSections> <nhibernate> <add  key=&quot;hibernate.connection.provider&quot;  value=&quot;NHibernate.Connection.DriverConnectionProvider&quot;  /> <add  key=&quot;hibernate.dialect&quot;  value=&quot;NHibernate.Dialect.MySQLDialect&quot;  /> <add  key=&quot;hibernate.connection.driver_class&quot;  value=&quot;NHibernate.Driver.MySqlDataDriver&quot;  /> <add  key=&quot;hibernate.connection.connection_string&quot;  value=&quot;Server=localhost;Database=TpvHibernate;User ID=jorge;Password=jorge&quot;  /> </nhibernate> </configuration> Generalmente en el  app.config  de la aplicación
Usamos la API del Nhibernate (5) 1.       Agregamos una referencia a NHibernate.dll (para usarlo en nuestra aplicación)  2.       Creamos un objeto de Configuración Configuration cfg = new Configuration(); 3.       Le decimos al Configuration sobre los tipos de objetos que vamos a persistir  cfg.AddAssembly(“TPVBO&quot;);   //  En TPVBO.dll están mis class con mis class.hbm.xml.... 4.       Creamos una Fabrica de sesiones (1 X BD) y luego le pedimos una Session y comenzamos una transacción.  ISessionFactory factory = cfg.BuildSessionFactory(); ISession session = factory.OpenSession(); ITransaction transaction = session.BeginTransaction();   5.       Trabajamos con nuestros objetos  Producto p=new Producto(); p.Codigo=“CA123”;  p.Descripcion=“Camisa CA”;  p.Precio=59.90; session.Save(p);  6.       Grabamos  la transacción en la BD y cerramos la sesión. transaction.Commit(); session.Close();
La session ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Con una session abierta     ISession session = factory.OpenSession();
Las asociaciones entre objetos ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Mapeando herencia <class name=&quot;TPVBO.Producto, TPVBO&quot; table=&quot;Producto&quot; > <id name=&quot;ProductoID&quot; column=&quot;productoID&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Codigo&quot; type = &quot;String(15)&quot; /> <property name=&quot;Descrip&quot; type = &quot;String(40)&quot; /> <property name=&quot;Precio&quot; type = &quot;Decimal(10,2)&quot; /> <joined-subclass name=&quot;TPVBO.Articulo, TPVBO&quot; table=&quot;Articulo&quot;> <key column=&quot;ProductoID&quot;/> <property name=&quot;Costo&quot; type = &quot;Decimal(10,2)&quot; /> <property name=&quot;Stock&quot; type = &quot;Int32&quot; /> </joined-subclass> <joined-subclass name=&quot;TPVBO.Promocion,TPVBO&quot; table=“Promocion&quot;> <key column=&quot;ProductoID&quot;/> <property name=&quot;Validez&quot; type = &quot;DateTime&quot; /> <bag name=&quot;Articulos&quot; cascade=&quot;all&quot;> <key column=&quot;promocion&quot;/> <one-to-many class=&quot;TPVBO.Articulo, TPVBO&quot;/> </bag> </joined-subclass> </class>
Manejo de colecciones //  Creo una Venta – En el mapping de venta dice :  <bag name=&quot;LineaVenta&quot; cascade=&quot;all&quot;> Venta v=new Venta(); v.Fecha=hoy;  v.Numero=22; //  Creo 2 lineas de venta LineaVenta l1=new LineaVenta(); l1.Cantidad=10; l1.Producto=session.Load(typeof(Producto),155); LineaVenta l2=new LineaVenta(); l2.Cantidad=5; l2.Producto=session.Load(typeof(Producto),189); //  agrego a la colección de lineas de venta de v, las 2 lineas creadas v.lineas.Add(l1);  v.lineas.Add(l2); //  grabo la venta a la session con sus 2 lineas (por tener el  cascade=all ): En la BD se inserta una fila en Venta y 2 en LineaVenta   session.Save(v); session.Flush();
Trabajando con transacciones (la forma usual...) try {  session = factory.OpenSession(); transaction = session.BeginTransaction(); session.SaveOrUpdate(miObjetoNegocio); transaction.Commit(); } catch (Exception ex) {  transaction.Rollback(); } finally { session.Close(); }
Y el manejo de la concurrencia? Se puede agregar un campo “timeStamp” (dateTime) en cada tabla de la BD y un atributo en la clase. Luego en el mapeo (XML): <version name=&quot;Version&quot; column=&quot;version&quot; type = &quot;DateTime&quot; />  try  {   this.sesion.SaveOrUpdate(this.p);   tx.Commit();  } catch (NHibernate.StaleObjectStateException ex)  {    tx.Rollback();   // Otro usr. realizo cambios, pregunto si quiere reLeer   DialogResult resp;   resp=MessageBox.Show(“Este registro ha variado desde la última vez que se  recuperó, desea ver su estado actual?&quot;,  &quot;Aviso&quot;,  MessageBoxButtons.YesNo);   if(resp == DialogResult.Yes)  this.recuperaDatos(this.p);  } finally{this.sesion.Close();}

More Related Content

What's hot

PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
Darwin Durand
 
Sistema Ado.Net
Sistema Ado.NetSistema Ado.Net
Sistema Ado.Net
Personal
 
Taller programacion orientada a objetos
Taller programacion orientada a objetosTaller programacion orientada a objetos
Taller programacion orientada a objetos
israel11_90
 
Generación de Interfaces a partir de XML
Generación de Interfaces a partir de XMLGeneración de Interfaces a partir de XML
Generación de Interfaces a partir de XML
Jose Benítez Andrades
 

What's hot (20)

XML con J de JDOM
XML con J de JDOMXML con J de JDOM
XML con J de JDOM
 
Almdedat
AlmdedatAlmdedat
Almdedat
 
Clase viii
Clase viiiClase viii
Clase viii
 
Base de datos Objeto-Relacional.
Base de datos Objeto-Relacional.Base de datos Objeto-Relacional.
Base de datos Objeto-Relacional.
 
Lotus script
Lotus scriptLotus script
Lotus script
 
OLE BD
OLE BDOLE BD
OLE BD
 
S3 - ADO.NET
S3 - ADO.NETS3 - ADO.NET
S3 - ADO.NET
 
Base de datos
Base de datosBase de datos
Base de datos
 
7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona
 
Clase ix
Clase ixClase ix
Clase ix
 
PERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOSPERSISTENCIA BASADA EN ARCHIVOS
PERSISTENCIA BASADA EN ARCHIVOS
 
Sistema Ado.Net
Sistema Ado.NetSistema Ado.Net
Sistema Ado.Net
 
Taller programacion orientada a objetos
Taller programacion orientada a objetosTaller programacion orientada a objetos
Taller programacion orientada a objetos
 
Generación de Interfaces a partir de XML
Generación de Interfaces a partir de XMLGeneración de Interfaces a partir de XML
Generación de Interfaces a partir de XML
 
S3-PD1-2.1 Ado net
S3-PD1-2.1 Ado netS3-PD1-2.1 Ado net
S3-PD1-2.1 Ado net
 
Sql dataadapter
Sql dataadapterSql dataadapter
Sql dataadapter
 
Fo 5.desarrollo android-almacenamientodedatos
Fo 5.desarrollo android-almacenamientodedatosFo 5.desarrollo android-almacenamientodedatos
Fo 5.desarrollo android-almacenamientodedatos
 
Unidad iv ddl
Unidad iv ddlUnidad iv ddl
Unidad iv ddl
 
Sql server 2005 (bda)henrry
Sql server 2005 (bda)henrrySql server 2005 (bda)henrry
Sql server 2005 (bda)henrry
 
Acceso a datos con ado.net en visual basic
Acceso a datos con ado.net en visual basicAcceso a datos con ado.net en visual basic
Acceso a datos con ado.net en visual basic
 

Similar to Persistencia de un modelo de objetos

ADO NET Entity FrameWork
ADO NET Entity FrameWorkADO NET Entity FrameWork
ADO NET Entity FrameWork
mascodigo
 
Active x data object ado.net
Active x data object ado.netActive x data object ado.net
Active x data object ado.net
Gissela Antohane
 
IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005
oswchavez
 
Framework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netFramework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .net
Antonio Palomares Sender
 
Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)
josecuartas
 

Similar to Persistencia de un modelo de objetos (20)

Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Desarrollo en Capas con .Net
Desarrollo en Capas con .NetDesarrollo en Capas con .Net
Desarrollo en Capas con .Net
 
Jdbc
JdbcJdbc
Jdbc
 
ADO NET Entity FrameWork
ADO NET Entity FrameWorkADO NET Entity FrameWork
ADO NET Entity FrameWork
 
Active x data object ado.net
Active x data object ado.netActive x data object ado.net
Active x data object ado.net
 
6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
 
No SQL MSATS MongoDB | SolidQ Summit 2014
No SQL MSATS MongoDB | SolidQ Summit 2014No SQL MSATS MongoDB | SolidQ Summit 2014
No SQL MSATS MongoDB | SolidQ Summit 2014
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
 
1 -programacion_oo
1  -programacion_oo1  -programacion_oo
1 -programacion_oo
 
ADO .NET
ADO .NETADO .NET
ADO .NET
 
IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Ead aplicaciones prácticas
Ead aplicaciones prácticasEad aplicaciones prácticas
Ead aplicaciones prácticas
 
Arquitectura N-Capas y ADo.NET
Arquitectura N-Capas y ADo.NETArquitectura N-Capas y ADo.NET
Arquitectura N-Capas y ADo.NET
 
Guia herramientas de bd
Guia herramientas de bdGuia herramientas de bd
Guia herramientas de bd
 
Framework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .netFramework .NET 3.5 06 Operativa básica del framework .net
Framework .NET 3.5 06 Operativa básica del framework .net
 
Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)
 

Recently uploaded

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Recently uploaded (11)

Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 

Persistencia de un modelo de objetos

  • 1. Persistencia de un Modelo de Objetos “ persistencia : capacidad de almacenar y recuperar el estado de los objetos, de forma que sobrevivan a los procesos que los manipulan” UTN – Jorge Ercoli (Docente TSSI)
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. Creamos las clases y las tablas (1 y 2)
  • 12. Hacemos el mapping (3) <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <hibernate-mapping xmlns=&quot;urn:nhibernate-mapping-2.0&quot; default-access=&quot;property&quot;> <class name=&quot;TPVBO.Venta, TPVBO&quot; table=&quot;Venta&quot; > <id name=&quot;VentaID&quot; column=&quot;idVenta&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Fecha&quot; type = &quot;DateTime&quot; /> <property name=&quot;Numero&quot; type = &quot;Int32&quot; /> <bag name=&quot;LineaVenta&quot; cascade=&quot;all&quot;> <key column=&quot;venta&quot;/> <one-to-many class=&quot;TPVBO.LineaVenta, TPVBO&quot;/> </bag> </class> </hibernate-mapping> Venta.hbm.xml ................... <class name=&quot;TPVBO.LineaVenta, TPVBO&quot; table=&quot;lineaventa&quot; > <id name=&quot;LineaVentaID&quot; column=“idLineaVta&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Cantidad&quot; type = &quot;Int32&quot; /> <many-to-one name=“Producto&quot; class=&quot;TPVBO.Producto, TPVBO&quot; column=&quot;producto&quot; /> </class> </hibernate-mapping> LineaVenta. hbm.xml
  • 13. Creamos el archivo de configuración (4) <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?> <configuration> <configSections> <section name=&quot;nhibernate&quot; type=&quot;System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089&quot; /> </configSections> <nhibernate> <add key=&quot;hibernate.connection.provider&quot; value=&quot;NHibernate.Connection.DriverConnectionProvider&quot; /> <add key=&quot;hibernate.dialect&quot; value=&quot;NHibernate.Dialect.MySQLDialect&quot; /> <add key=&quot;hibernate.connection.driver_class&quot; value=&quot;NHibernate.Driver.MySqlDataDriver&quot; /> <add key=&quot;hibernate.connection.connection_string&quot; value=&quot;Server=localhost;Database=TpvHibernate;User ID=jorge;Password=jorge&quot; /> </nhibernate> </configuration> Generalmente en el app.config de la aplicación
  • 14. Usamos la API del Nhibernate (5) 1.      Agregamos una referencia a NHibernate.dll (para usarlo en nuestra aplicación) 2.       Creamos un objeto de Configuración Configuration cfg = new Configuration(); 3.       Le decimos al Configuration sobre los tipos de objetos que vamos a persistir cfg.AddAssembly(“TPVBO&quot;); // En TPVBO.dll están mis class con mis class.hbm.xml.... 4.       Creamos una Fabrica de sesiones (1 X BD) y luego le pedimos una Session y comenzamos una transacción. ISessionFactory factory = cfg.BuildSessionFactory(); ISession session = factory.OpenSession(); ITransaction transaction = session.BeginTransaction(); 5.       Trabajamos con nuestros objetos Producto p=new Producto(); p.Codigo=“CA123”; p.Descripcion=“Camisa CA”; p.Precio=59.90; session.Save(p); 6.       Grabamos la transacción en la BD y cerramos la sesión. transaction.Commit(); session.Close();
  • 15.
  • 16.
  • 17. Mapeando herencia <class name=&quot;TPVBO.Producto, TPVBO&quot; table=&quot;Producto&quot; > <id name=&quot;ProductoID&quot; column=&quot;productoID&quot; unsaved-value=&quot;0&quot;> <generator class=&quot;identity&quot; /> </id> <property name=&quot;Codigo&quot; type = &quot;String(15)&quot; /> <property name=&quot;Descrip&quot; type = &quot;String(40)&quot; /> <property name=&quot;Precio&quot; type = &quot;Decimal(10,2)&quot; /> <joined-subclass name=&quot;TPVBO.Articulo, TPVBO&quot; table=&quot;Articulo&quot;> <key column=&quot;ProductoID&quot;/> <property name=&quot;Costo&quot; type = &quot;Decimal(10,2)&quot; /> <property name=&quot;Stock&quot; type = &quot;Int32&quot; /> </joined-subclass> <joined-subclass name=&quot;TPVBO.Promocion,TPVBO&quot; table=“Promocion&quot;> <key column=&quot;ProductoID&quot;/> <property name=&quot;Validez&quot; type = &quot;DateTime&quot; /> <bag name=&quot;Articulos&quot; cascade=&quot;all&quot;> <key column=&quot;promocion&quot;/> <one-to-many class=&quot;TPVBO.Articulo, TPVBO&quot;/> </bag> </joined-subclass> </class>
  • 18. Manejo de colecciones // Creo una Venta – En el mapping de venta dice : <bag name=&quot;LineaVenta&quot; cascade=&quot;all&quot;> Venta v=new Venta(); v.Fecha=hoy; v.Numero=22; // Creo 2 lineas de venta LineaVenta l1=new LineaVenta(); l1.Cantidad=10; l1.Producto=session.Load(typeof(Producto),155); LineaVenta l2=new LineaVenta(); l2.Cantidad=5; l2.Producto=session.Load(typeof(Producto),189); // agrego a la colección de lineas de venta de v, las 2 lineas creadas v.lineas.Add(l1); v.lineas.Add(l2); // grabo la venta a la session con sus 2 lineas (por tener el cascade=all ): En la BD se inserta una fila en Venta y 2 en LineaVenta session.Save(v); session.Flush();
  • 19. Trabajando con transacciones (la forma usual...) try { session = factory.OpenSession(); transaction = session.BeginTransaction(); session.SaveOrUpdate(miObjetoNegocio); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); } finally { session.Close(); }
  • 20. Y el manejo de la concurrencia? Se puede agregar un campo “timeStamp” (dateTime) en cada tabla de la BD y un atributo en la clase. Luego en el mapeo (XML): <version name=&quot;Version&quot; column=&quot;version&quot; type = &quot;DateTime&quot; /> try { this.sesion.SaveOrUpdate(this.p); tx.Commit(); } catch (NHibernate.StaleObjectStateException ex) { tx.Rollback(); // Otro usr. realizo cambios, pregunto si quiere reLeer DialogResult resp; resp=MessageBox.Show(“Este registro ha variado desde la última vez que se recuperó, desea ver su estado actual?&quot;, &quot;Aviso&quot;, MessageBoxButtons.YesNo); if(resp == DialogResult.Yes) this.recuperaDatos(this.p); } finally{this.sesion.Close();}