Download Clase 5 - DCIC

Document related concepts

Mapeo objeto wikipedia , lookup

Modelo de base de datos wikipedia , lookup

Java Persistence API wikipedia , lookup

Capa de acceso a datos wikipedia , lookup

Base de datos relacional wikipedia , lookup

Transcript
25/04/2014
Patrones de Diseño Empresariales
Mapeando a Bases de Datos Relacionales
¿Cómo se puede resolver el “impedance
mismatch” impedance mismatch (desajuste
por impedancia) entre modelo de objetos y
modelo relacional?
Existen distintos tipos de patrones que
consideran la problemática de la persistencia
de datos:
 Patrones Arquitectónicos
 Patrones de Comportamiento
Objeto-Relacional
 Patrones Estructurales
Objeto-Relacional
 Patrones de Mapeo de Metadatos
Objeto-Relacional
Clase 5
Lic. Ariel Trellini
Dominio
Acceso a Datos
DCIC - UNS
Desarrollo de Aplicaciones Empresariales • 101
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales
Presentación
Dominio
Tipo de Patrón
Presentación
Objetivo
Patrones
Acceso a Datos
Patrones
Arquitectónicos
¿Cómo la lógica de dominio se comunica con
la base de datos?
Table Data Gateway
Row Data Gateway
Active Record
Data Mapper
Patrones de
Comportamiento
Objeto-Relacional
¿Cómo realizar el manejo de los objetos
(cargarlos/guardarlos)?
Unit Of Work
Identity Map
Lazy Load
Patrones
Estructurales
Objeto-Relacional
¿Cómo mapear los conceptos de la OO a la
base de datos relacional?
Identity Field
Foreing Key Mapping
Association Table Mapping
Dependent Mapping
Embedded Value
Serialized LOB
Inheritance Patterns…
Inheritance Mapper
Patrones de Mapeo
de Metadatos
Objeto-Relacional
¿Cómo definir declarativamente el mapeo
objeto-relacional y encapsularlo, proponiendo
una interfaz orientada a objetos?
Metadata Mapping
Query Object
Repository
Desarrollo de Aplicaciones Empresariales • 102
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Table Data Gateway
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales
PATRONES ARQUITECTONICOS
Presentación
Dominio
Acceso a Datos
Table Data Gateway
Un objeto que actúa como Gateway a una tabla de base de datos.
Una instancia maneja todas las filas en la tabla.
Desarrollo de Aplicaciones Empresariales • 103
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Table Data Gateway
Presentación
¿Cómo Trabaja?
Dominio
Presentación
¿Cuándo Utilizarlo?
Dominio
Acceso a Datos
 Características:




 Dado que su implementación es muy sencilla, sería apropiado para
Su interfaz consiste de:


Acceso a Datos
Métodos find para obtener información desde la BD
Métodos de actualización: insert, update, delete

Cada método ejecuta una sentencia SQL de acuerdo a sus parámetros.
Generalmente es stateless, ya que su rol es transferir datos entre el
dominio y la BD.
En las consultas, siempre retorna un conjunto de datos: Map, RecordSet,
DTOs



Desarrollo de Aplicaciones Empresariales • 104
Lic. Ariel Trellini • DCIC • UNS
aplicaciones muy pequeñas que no cuentan con una lógica de acceso a
datos compleja.
Si se ha decidido utilizar Table Modules para resolver la lógica de domino.
Table Data Gateway es el mejor socio para estos casos, ya que produce los
record sets que requiere un Table Module.
También es apropiado para Transaction Scripts, siempre y cuando el result
set sea conveniente para el Transaction Script.
La misma interfaz sirve para utilizar sentencias SQL directas o stored
procedures.
El resto de los casos.
Desarrollo de Aplicaciones Empresariales • 105
Lic. Ariel Trellini • DCIC • UNS
1
25/04/2014
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Row Data Gateway
Row Data Gateway
Presentación
Presentación
Dominio
¿Cómo Trabaja?
Dominio
Acceso a Datos
Acceso a Datos
Un objeto que actúa como Gateway a un único registro en una
tabla de base de datos. Hay una instancia por fila.




Imita exactamente un registro de la base de datos, de manera tal que cada
columna de la tabla es un campo del objeto.
Realiza todas las conversiones necesarias entre los tipos de datos de la base
de datos y los tipos del lenguaje de programación.
Trabaja particularmente bien con Transaction Script.
Métodos de búsqueda:



¿Cuál es diferencia entre Row Data Gateway y Active Record? La clave está
en si existe lógica de dominio en estos objetos.

Un Row Data Gateway permite obtener objetos que lucen como los registros de una
tabla, pero pueden ser accedidos a través de las facilidades del lenguaje de
programación utilizado. De esta manera, se encapsula toda la lógica específica
(generalmente SQL) de acceso a datos dentro del gateway.
Desarrollo de Aplicaciones Empresariales • 106
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Row Data Gateway


Métodos estáticos.
Objetos de búsqueda (buscadores).
Row Data Gateway
Active Record


Sin lógica de dominio
Con lógica de dominio
Si bien es bastante tedioso de escribir, es muy utilizado por los generadores
de código basados en Metadata Mapping.
Desarrollo de Aplicaciones Empresariales • 107
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Row Data Gateway
Presentación
¿Cuándo Utilizarlo?
Dominio
Acceso a Datos
 Principalmente, cuando se usa Transaction Script. Así, se factoriza el código
de acceso a los datos y se lo reutiliza entre distintos scripts.
 No sería conveniente utilizarlo en conjunto con Domain Model.
Opciones:
• Si el mapeo es simple, usar Active Record.
• Si el mapeo es más complejo, usar Data Mapper.
• Si se utiliza para aislar a los objetos de domino de la estructura de base de
datos, se tendrán 3 representaciones de los datos: una en los objetos de
dominio, una en los Row Data Gateways y una en la base de datos.
Funcionamiento del Row Data gateway
Desarrollo de Aplicaciones Empresariales • 108
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales
Active Record
Desarrollo de Aplicaciones Empresariales • 109
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Active Record
Presentación
Presentación
Dominio
¿Cómo Trabaja?
Acceso a Datos
Un objeto que wrappea una fila de una tabla de la base de datos,
encapsula la lógica de acceso a datos y agrega lógica de dominio
sobre aquellos datos.





Active Record utiliza la opción más obvia: pone la lógica de acceso a datos en el objeto
de dominio. De esta manera, todos los objetos de dominio conocen como guardar y
leer sus datos.
Lic. Ariel Trellini • DCIC • UNS
Dominio
Acceso a Datos
La esencia de un Active Record es un Domain Model en el cual las clases se
corresponden bastante con la estructura de tablas de la base de datos
subyacente.
Cada Active Record es responsable tanto de guardarse y cargarse en/desde
la base de datos, como de cualquier lógica de dominio que actúe sobre los
datos.
Típicamente tiene métodos para:

Desarrollo de Aplicaciones Empresariales • 110
Lic. Ariel Trellini • DCIC • UNS



Construir una instancia del Active Record a partir de una fila de un result set
SQL.
Construir una nueva instancia que luego será insertada en la base de datos.
Métodos de búsqueda estáticos para factorizar queries SQL repetitivas y
retornar instancias del Active Record.
Insertar y actualizar los datos del Active Record en la base de datos.
Obtener y asignar valores a los campos del Active Record.
Implementar algunas partes de la lógica de negocio.
Desarrollo de Aplicaciones Empresariales • 111
Lic. Ariel Trellini • DCIC • UNS
2
25/04/2014
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Active Record
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Active Record
Presentación
¿Cómo Trabaja? (Cont)



Dominio
Acceso a Datos
Los métodos get y set pueden realizar otras funciones como, por ejemplo,
convertir tipos orientados a SQL a tipos propios del lenguaje de
programación.
Se diferencia de Row Data Gateway en que Active Record contiene lógica
de negocio.
Puede utilizar métodos de búsqueda estáticos o puede utilizar objetos de
búsqueda (finders).
Presentación
¿Cuándo Utilizarlo?
 Es una buena elección para la lógica de dominio que no sea demasido





Desarrollo de Aplicaciones Empresariales • 112
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales
Dominio
Acceso a Datos
compleja, tales como operaciones CRUD. Validaciones basadas en los datos
de un único registro también funcionan bien.
Tiene la ventaja de la simplicidad comparado con Data Mapper.
Funcionan bien solamente si los objetos Active Record se corresponden
directamente con las tablas de la base de datos.
Es un buen patrón a considerar si se está usando Transaction Script y se
comienzan a sufrir sus desventajas (duplicación de código, mantenimiento,
etc).
Si la lógica de dominio es más compleja, se querrán usar relaciones directas
a objetos, colecciones, herencia, etc; cosas que no son fáciles de resolver
con Active Record.
Acopla el diseño de objetos al diseño de base de datos.
Desarrollo de Aplicaciones Empresariales • 113
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Data Mapper
Data Mapper
Presentación
Presentación
Dominio
¿Cómo Trabaja?
Dominio
Acceso a Datos
Acceso a Datos
Una capa de Mappers que mueven datos entre los objetos y la
base de datos manteniéndolos independientes unos de otros y del
mapper en sí mismo.

Hay muchas formas de construir una capa de Data Mappers. Sin embargo,
veremos ejemplos sencillos para entender la idea.
Los Data Mappers separan los objetos en memoria de la base de datos. Son
responsables de transferir los datos entre ambos y de mantenerlos aislados uno de
otro.
Recuperar datos de una base de datos.
Desarrollo de Aplicaciones Empresariales • 114
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Data Mapper
Desarrollo de Aplicaciones Empresariales • 115
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Data Mapper
Presentación
Presentación
Dominio
Acceso a Datos
Dominio

Identidad de los objetos





Cantidad de Mappers



Hardcoded: Uno por cada clase de dominio o raíz de un agregado.
Metadata Mapping: Unico mapper para todas las clases. Finders agrupados por
clase de dominio.
Desarrollo de Aplicaciones Empresariales • 116
Lic. Ariel Trellini • DCIC • UNS
Registry de Identity Maps
Cada clase finder mantenga su propio Identity Map, asegurando que habrá solamente
una clase finder por cada entidad de negocio.
Manejo de Finders

Actualizando datos
Acceso a Datos
Es necesario que exista en todo momento una única representación en memoria
de un objeto de domino, identificada por su identidad.
Hay dos opciones:


Lic. Ariel Trellini • DCIC • UNS
Varias veces una clase de dominio necesita acceder a un finder de otra clase de
dominio
Nunca agregar una dependencia desde un objeto de dominio al Data Mapper.
Utilizar Separated Interface, creando una interfaz con todos los métodos finders
requeridos por la clase de domino y ubicándola en el paquete de dominio.
Desarrollo de Aplicaciones Empresariales • 117
Lic. Ariel Trellini • DCIC • UNS
3
25/04/2014
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Data Mapper
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Data Mapper
Presentación
Presentación
Dominio

Mapear Datos a Propiedades del Dominio


Dominio

Mapeos Basados en Metadatos
Los mappers necesitan acceder a las variables de instancia de los objetos de
dominio. Esto sería un problema ya que debiéramos exponer miembros públicos
para los mappers, aun si no queremos que formen parte de la lógica de domino.
Algunas soluciones

Poner los mappers cerca de los objetos de dominio para sacar provecho de alguna
regla de visibilidad del lenguaje de programación.
Usar Reflection.
Utilizar métodos especiales, nombrados con alguna convención que permita
identificarlos.





Acceso a Datos






Mostrar ejemplos de mapeos: DAO c/SP, Entity Fwk, NHibernate
XML, Anotaciones JPA, Fluent NH
Permite crear una instancia bien formada.
Permite propiedades inmutables reales.
Cuidado con las referencias cíclicas.
Crea una instancia vacía que luego será completada con datos.
Permite resolver las referencias cíclicas con ayuda del Identity Map
Desarrollo de Aplicaciones Empresariales • 118
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a Bases de Datos Relacionales  Data Mapper
Desarrollo de Aplicaciones Empresariales • 119
Dominio
Acceso a Datos
 Cuando queremos que el esquema de base de datos y el modelo de
PATRONES DE COMPORTAMIENTO
OBJETO-RELACIONAL
cuando las cosas se ponen más complejas, Data Mapper toma ventaja.
Si se tiene un modelo de negocio simple.
Si no se quiere pagar el costo de una capa extra.
Si hay que construirlo desde cero.
Un data mapper es un monstruo complicado de construir.
Hay productos que ya resuelven la problemática, están
testeados e implementan muchos de los patrones vistos.
 ¿Cómo trabaja?


Cuando se comienza a trabajar con la BD, se crea un UoW
UoW mantiene registro de todos los objetos creados / modificados /
eliminados durante la transacción de negocio.
Al finalizar la transacción de negocio, el UoW decide qué hacer:




Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones de Comport. Objeto-Relacional
Presentación




Dominio

Identity Map

Manejo de transacciones distribuidas (múltiples BDs)
Logging
Realizar acciones luego del cierre de la transacción de BD.
 ¿Cómo trabaja?




Desarrollo de Aplicaciones Empresariales • 122
Dominio
Asegura que cada objeto sea cargado solamente una vez,
manteniendo cada objeto cargado en un map. Busca objetos a
través del map cuando se los referencia.
Para evitar tener referencias al ORM en la capa de negocios/aplicación
Para extenderlo con el fin de agregarle features

Presentación
Acceso a Datos
Hibernate  Session
Entity Framework  Context
etc.

Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones de Comport. Objeto-Relacional
Acceso a Datos
Construirlo desde cero es factible, aunque requeriría bastante esfuerzo.
Muchas veces se encapsula (wrappea) el UoW provisto por el ORM

Abrir una transacción de BD
Realizar chequeos de concurrencia (optimista)
Escribir cambios a la BD en el orden apropiado
Cerrar la transacción de BD
Desarrollo de Aplicaciones Empresariales • 121
Ya viene implementado en muchos ORMs:

Dominio
Mantiene una lista de objetos afectados por una transacción de
negocio y coordina la escritura de los cambios y la resolución de
problemas de concurrencia.

 ¿Cómo utilizarlo?
Presentación
Acceso a Datos
Unit Of Work
dominio evolucionen independientemente
 Cuando utilizamos Domain Model. Si bien se podría utilizar Active Record,
Desarrollo de Aplicaciones Empresariales • 120
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones de Comport. Objeto-Relacional
Presentación
¿Cuándo Utilizarlo?

Mantiene la metadata de mapeo como datos, ya sea en la misma clase de dominio o
en una clase separada.
Existen distintas variantes para metadatas: XML, atributos/anotaciones, fluent
interfaces, modelos graficos.
Constructor Vacío:




Implica tener un mapper por cada objeto de negocio.
El mapeo se realiza a través de asignaciones y sentencias SQL que mantiene
internamente
Metadata Mapping

Constructor Rico

Código explícito

Constructores

Acceso a Datos
Lic. Ariel Trellini • DCIC • UNS
Mantiene registro de todos los objetos que han sido leídos desde la BD en
una única transacción de negocio.
Cuando se quiere obtener un objeto, primero se busca en el map por si ya
está. Si no está, se busca en la BD y se lo incorpora al map.
Si se utiliza el concepto de Unit Of Work, entonces el UoW es el mejor lugar
para el Identity Map.
También sirve como caché de los objetos obtenidos en una transacción de
negocio.
Desarrollo de Aplicaciones Empresariales • 123
Lic. Ariel Trellini • DCIC • UNS
4
25/04/2014
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones de Comport. Objeto-Relacional
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
Lazy Load
PATRONES ESTRUCTURALES OBJETO-RELACIONAL
Presentación
Dominio
Acceso a Datos
Un objeto que no contiene todos los datos que necesitas, pero
sabe cómo obtenerlos.
Identity Field

Lazy Load interrumpe el proceso de carga de objetos relacionados al objeto
que se quiere recuperar, dejando una marca en la estructura de objetos tal
que si el dato es necesario, pueda ser cargado solamente cuando sea usado.
Alternativas de implementación: Lazy initialization, Virtual proxy, Value
holder, Ghost
 ¿Cómo trabaja?

Elegir la clave





Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
 ¿Cómo trabaja?

Elegir la clave (cont.)



Dominio
Clave simple: Solamente usa un campo de la base de datos.
Clave compuesta: Usa más de un campo de la base de datos.
Alcance de unicidad de las claves


Únicas por tabla
Únicas por base de datos
Desarrollo de Aplicaciones Empresariales • 125
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
Foreign Key Mapping
Presentación
Dominio
Acceso a Datos
Acceso a Datos
Mapea una asociación entre objetos a una foreing key entre tablas
Las operaciones más frecuentes son: igualdad y siguiente clave
Pueden tener efecto en la performance e índices de las BDs.
Generalmente se utilizan: long, GUID e int.
 ¿Cómo trabaja?
Representar el Identity Field en un objeto




Presentación


Meaningful key: Por ejemplo, el número de documento de una persona
Meaningless key: Número aleatorio que no sería utilizado por humanos.
Claves simples o compuestas

Tipo y tamaño



Actualmente lo proveen por defecto muchos ORMs.
Balancear la información que se recupera en un acceso versus la cantidad
de accesos que se requerirán para recuperar la información necesaria.
Principalmente se utiliza para colecciones de objetos relacionados.
Cuidado con el problema del N+1 !
Desarrollo de Aplicaciones Empresariales • 124
Claves con o sin sentido

 ¿Cuándo utilizarlo?

Dominio
Guarda el campo ID de la base de datos en el objeto para
mantener la identidad entre un objeto en memoria y la fila de la
base de datos
 ¿Cómo trabaja?

Presentación
Acceso a Datos
La forma más simple de Identity Field es un campo que concuerde con el tipo de
la clave en la BD
Para las claves compuestas, generalmente se utiliza una clase que las representa.
Muchas veces se factoriza la definición de la clave (junto con la operación de
igualdad) en una clase de entidad base y ese comportamiento es heredado por
todas las entidades del sistema.
Obtener una nueva clave



Delegar en la BD y que la auto-genere
Usar un GUID
Generar propias (max function, tabla de claves separada)
Desarrollo de Aplicaciones Empresariales • 126
Mapeando una referencia
Lic. Ariel Trellini • DCIC • UNS
Desarrollo de Aplicaciones Empresariales • 127
Mapeando una colección
Lic. Ariel Trellini • DCIC • UNS
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
Association Table Mapping
Dependent Mapping
Presentación
Dominio
Acceso a Datos
Guarda una asociación con una tabla con foreign keys a las tablas
que están linkedas por la asociación.
 ¿Cómo trabaja?
Dominio
Una clase tiene que realizar el mapeo de BD para una clase hija
 ¿Cómo trabaja?

El objeto dependiente:







Desarrollo de Aplicaciones Empresariales • 128
Presentación
Acceso a Datos
Lic. Ariel Trellini • DCIC • UNS
Sólo tiene un owner
No puede haber referencias a él
desde otro objeto que no sea su
owner
No tiene un Identity Field
No es almacedo en el Identity
Map
No puede ser buscado
directamente.
Sólo es accedido desde su owner
Generalmente es un Value Object
Desarrollo de Aplicaciones Empresariales • 129
Lic. Ariel Trellini • DCIC • UNS
5
25/04/2014
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
Patrones de Diseño Empresariales  Mapeando a BD Relacionales  Patrones Estructurales Objeto-Relacional
Embedded Value
Serialized LOB
Presentación
Dominio
Acceso a Datos
Mapea un objeto en varios campos de la tabla de otro objeto
 ¿Cómo trabaja?
Dominio
Guarda un grafo de objetos serializándolos en un único objeto
grande (LOB), el cual se almacena en un campo de la BD.
 ¿Cómo trabaja?

Tipos de serialización:



Desarrollo de Aplicaciones Empresariales • 130
Presentación
Acceso a Datos
Lic. Ariel Trellini • DCIC • UNS
BLOB: Binary LOB
CLOB: Textual characters LOB
Se diferencia con Embedded
Value en que está orientado
estructuras de objetos más
complejas.
Desarrollo de Aplicaciones Empresariales • 131
Lic. Ariel Trellini • DCIC • UNS
6