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

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Recently uploaded (15)

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
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
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
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
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
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
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 

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();}