Beruflich Dokumente
Kultur Dokumente
BD
Orientadas a Objetos
BDOO
BD
Relacionales
Lgica
del dominio
Persistencia
Servicios para comunicar la capa lgica con el almacenamiento (BD) Capa de acceso a datos (DAO DAC) (Ejs.: ADO.Net Hibernate)
Transaction Script Un procedimiento X accin del usuario (1 controladora del sistema 1 X cada CU) Dificil de aplicar si el dominio es complejo Se ve a la aplicacin como una serie de transacciones Domain Model Diseo OO de los componentes del sistema se incorporan conceptos como herencia y patrones de diseo Problema: GAP entre el modelo de objetos y la BDR Aplicacin vista como un set de objetos interrelacionados
Resumiendo : En TS no hacemos un diseo OO, simplemente escribimos mtodos por c/solicitud de la IU y los encapsulamos en 1 + clases. En DM diseamos una aplicacin OO donde podemos aplicar todo tipo de asociaciones entre objetos (entre ellas la herencia).
Table Gateway
para cada tabla tenemos asociada una implementacin de tipo CRUD (Create-Retrieve-Update-Delete) La estructura de datos que es utilizada gralmente. para comunicarse tanto con la base de datos como con la capa de lgica, es de tipo Record Set (DataSet en ADO.Net) ResultSet (JDBC)
Row Gateway
Similar al anterior, aunque se trabaja a nivel de filas de la tabla, por lo que las operaciones CRUD tienen asociadas implcitamente la clave de la fila Las operaciones de bsqueda pueden ser servicios estticos de la clase o pertenecer a una nueva clase
Active Record
Generalmente se comenzo con Row Gateway y se le adicion lgica del dominio La bsqueda se hace en otra clase
Data Mapper
Abstrae totalmente la lgica de la BD transferir informacin entre la base de datos y los objetos de la capa de lgica sin que estos tomen conocimiento
T. Script
Domain Model
NHibernate
Ejemplo: .......
Venta v=sesion.Load(typeof(Venta), idventa); v.Lineas.Add(nuevaLinea); v.Cliente.Saldo=v.Cliente.Saldo + nuevaLinea.Total; Transaccion.Commit();
hbm.xml
</class> </hibernate-mapping>
cfg.AddAssembly(TPVBO");
4.
Creamos una Fabrica de sesiones (1 X BD) y luego le pedimos una Session y comenzamos una transaccin.
session.Save(p);
6. Grabamos la transaccin en la BD y cerramos la sesin.
transaction.Commit(); session.Close();
La Session en NHibernate:
La session
Definen las relaciones entre las clases Se definen en el archivo de mapeo (clase.hbm.xml) NHibernate usa los mapeos de asociaciones para grabar y recuperar automaticamente los objetos relacionados :
<one-to-one> Una Venta tiene un Pedido <one-to-many> Una Venta tiene muchas lineaVenta <many-to-one> Una lineaVenta tiene un Producto (muchas lineaVenta, un Producto) <many-to-many> Un Empleado tiene muchas Tareas, y una Tarea tiene muchos Empleados
Mapeando herencia
<class name="TPVBO.Producto, TPVBO" table="Producto" > <id name="ProductoID" column="productoID" unsaved-value="0"> <generator class="identity" /> </id> <property name="Codigo" type = "String(15)" /> <property name="Descrip" type = "String(40)" /> <property name="Precio" type = "Decimal(10,2)" /> <joined-subclass name="TPVBO.Articulo, TPVBO" table="Articulo"> <key column="ProductoID"/> <property name="Costo" type = "Decimal(10,2)" />
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 coleccin 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();
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();}