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)
13. Creamos el archivo de configuración (4) <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <nhibernate> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="hibernate.dialect" value="NHibernate.Dialect.MySQLDialect" /> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.MySqlDataDriver" /> <add key="hibernate.connection.connection_string" value="Server=localhost;Database=TpvHibernate;User ID=jorge;Password=jorge" /> </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"); // 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();
18. Manejo de colecciones // Creo una Venta – En el mapping de venta dice : <bag name="LineaVenta" cascade="all"> 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="Version" column="version" type = "DateTime" /> 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?", "Aviso", MessageBoxButtons.YesNo); if(resp == DialogResult.Yes) this.recuperaDatos(this.p); } finally{this.sesion.Close();}