Persistencia en BD. Instituto de Computación Facultad de Ingeniería Universidad de la República


Save this PDF as:
 WORD  PNG  TXT  JPG

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Persistencia en BD. Instituto de Computación Facultad de Ingeniería Universidad de la República"

Transcripción

1 Persistencia en BD Instituto de Computación Facultad de Ingeniería Universidad de la República

2 Agenda Destinos y mecanismos de persistencia Acceso directo a la BD Java Data Base Connectivity (JDBC) Impedance Mismatch Mapeador Objeto-Relacional (ORM) Java Persistence API (JPA) Entidades Relaciones EntityManager Empaquetado 2

3 Destino de Persistencia Persistencia de Objetos Extender el tiempo de vida de un objeto más allá del tiempo de vida del proceso que lo creó. Destino de Persistencia Fuente de datos (Data Source) donde se persiste la información de una aplicación. BD relacional, archivos xml, binarios... 3

4 Mecanismos de Persistencia Definición Técnica básica que permite resolver la persistencia de objetos. Mecanismos Acceso directo a base de datos relacional Mapeador Objeto-Relacional Serialización de Objetos Generador de código 4

5 Acceso directo a la BD Ventaja Buen desempeño debido a que el acceso a la base se realiza en forma directa Desventaja Mayor complejidad para el diseño de la persistencia Herramienta Java Java Database Connectivity (JDBC) 5

6 JDBC Provee una arquitectura basada en drivers e interfaces estándar Se basa en sentencias SQL para realizar consultas y modificar el estado de la BD La interfaz de programación es portable pero el lenguaje SQL depende del proveedor de BD 6

7 JDBC - Arquitectura 7

8 JDBC - Diseño Patrón de Diseño DAO: Encapsula todo el acceso a una fuente de datos utilizando la capa de acceso a datos. Cada objeto de negocio a ser persistido crea un DAO con la información necesaria. Luego utiliza el objeto DAO para obtener y guardar información del origen de datos. Problema al mapear entidades y relaciones Impedance Mismatch 8

9 Impedance Mismatch Diferencias entre modelo OO y relacional 9

10 Impedance Mismatch Ejemplo: mapeo de una entidad 10

11 Impedance Mismatch Entidad 11

12 Impedance Mismatch Ejemplo: Relaciones 12

13 Impedance Mismatch 13

14 Impedance Mismatch Herencia 14

15 Impedance Mismatch 15

16 Mapeador Objeto-Relacional 16

17 Mapeador Objeto-Relacional La técnica que busca llenar el vacío entre el modelo relacional y el modelo orientado a objetos, se denomina mapeo Objeto- Relacional (object-relational mapping) También conocido como O-R mapping u ORM Introducimos un mediador, encargado de mapear automáticamente los conceptos de un modelo en el otro 17

18 Mapeador Objeto-Relacional Ventaja Reduce la cantidad de código necesario para lograr la persistencia. La aplicación resultante es fácil de mantener. Desventaja Requiere mantener metadata sobre las entidades. Herramienta Java: JPA Hibernate EclipseLink 18

19 Java Persistence API Es un framework liviano para mapear objetos a BD relacionales usando la Plataforma Java en sus ediciones Standard (Java SE) y Enterprise (Java EE) Surge originalmente de la mano de EJB 3.0, adoptando la experiencia de años de uso de Hibernate y Toplink, seguidos luego por JDO 19

20 Java Persistence API Persistencia basada en POJOs (Plain Old Java Objects) La persistencia esta guiada por metadatos XML Anotaciones Gran uso de valores por defecto (configuración por excepción) Los metadatos se pueden agrupar en anotaciones lógicas y físicas 20

21 Java Persistence API Consultas orientadas a objetos Provee un mecanismo para realizar consultas, recorriendo los objetos, sus propiedades y sus relaciones, sin necesidad de conocer columnas o claves foráneas a nivel de la base de datos Las consultas eventualmente serán traducidas a SQL por el framework de consultas de JPA 21

22 JPA - Entidades Entidades Se anotan Tienen una propiedad anotada Constructor sin argumentos public/protected No puede ser final Puede extender de otra Puede ser abstracta Son POJOs (Plain Old Java Object) 22

23 JPA - Entidades Ejemplo 23

24 JPA - Entidad Mapeo de entidades Por defecto se persisten en una tabla con el nombre de la clase Si queremos persistir en otra tabla a nivel de la BD, podemos usar la 24

25 JPA - Entidades Generación de identificadores: A veces las aplicaciones deciden desentenderse de la generación automática de los identificadores Para ello se usa la en combinación con la No podemos confiar en que el valor este presente hasta que la transacción sea completada 25

26 JPA - Entidades Mapeo de atributos con tipo simple Incluye int, float, boolean, String, Date, Calendar, enumerados, etc. Por defecto se persisten todos los atributos, en columnas con el mismo nombre Si queremos persistirlos en otra columna a nivel de la DB, podemos usar la 26

27 JPA - Relaciones Direccionalidad Relaciones Unidireccionales Relaciones Bidireccionales Cardinalidad One-to-one One-to-many Many-to-one Many-to-many 27

28 JPA - Relaciones ManyToOne - Unidireccional 28

29 JPA - Relaciones ManyToOne Unidireccional Para indicar la columna que permite realizar el join a nivel de la DB, utilizamos la 29

30 JPA - Relaciones OneToOne - Unidireccional 30

31 JPA - Relaciones OneToOne - Unidireccional La permite indicar la columna a la que se va a mapear la relación 31

32 JPA - Relaciones OneToOne - Bidireccional 32

33 JPA - Relaciones OneToOne Bidireccional La anotación mappedby sirve para indicar que una referencia corresponde a una relación bidireccional y no dos unidireccionales independientes La va a estar en la entidad que contiene la columna a la que se va a mapear la relación. Esta entidad se conoce como owner (dueña) de la relación La otra entidad se conoce como el lado inverso de la relación y debe tener la 33

34 JPA - Relaciones OneToMany / ManyToOne - Bidireccional Una relación OneToMany bidireccional implica que también existe una relación ManyToOne bidireccional Generalmente se implementa como: Una relación ManyToOne que en la que va a estar definida la Join Column Una relación OneToMany que va a ser el lado inverso, anotada con mappedby 34

35 JPA - Relaciones OneToMany / ManyToOne - Bidireccional 35

36 JPA - Relaciones ManyToMany - Bidireccional 36

37 JPA - Relaciones ManyToMany Bidireccional Es posible configurar la tabla usada para mantener las relaciones a través de la 37

38 JPA - Relaciones ManyToMany Bidireccional Join Table 38

39 JPA - Relaciones OneToMany - Unidireccional 39

40 JPA - Relaciones OneToMany Unidireccional También es posible especificar la JoinTable que debe ser usada a nivel de DB 40

41 JPA - EntityManager Las entidades no se persisten a si mismas cuando son creadas, así como tampoco son removidas cuando el garbage collector recicla los objetos Es la lógica de la aplicación la que debe manejar el ciclo de vida de persistencia Para este propósito, JPA provee la interfaz EntityManager La EntityManagerFactory se obtiene de la clase Persistence: 41

42 JPA - EntityManager La interfaz EntityManager define una serie de métodos que permiten manejar el ciclo de vida de las entidades de una aplicación Estos métodos incluyen operaciones como Persistencia de entidades Recuperación de entidades Obtención de consultas Inicio y fin de transacciones 42

43 JPA - EntityManager Ciclo de vida de las entidades 43

44 JPA - EntityManager persist() Esta operación acepta una nueva entidad como parámetro y la pone en estado managed Si la entidad a persistir ya esta siendo administrada por el contexto de persistencia, entonces la operación la ignora Podemos usar la operación contains() para verificar si la entidad esta managed La invocación de esta operación no significa que la entidad es persistida en ese momento 44

45 JPA - EntityManager persist() Ejemplo: 45

46 JPA - EntityManager find() Cuando una entidad debe ser localizada usando su primary key, entonces el método a utilizar es find() Si la entidad existe devuelve una entidad que queda en estado managed Si no existe devuelve null Ejemplo: 46

47 JPA - EntityManager remove() Para remover una entidad, debemos pasar al método remove() una instancia de la entidad, que se encuentre en estado managed Cuando el estado del contexto de persistencia se sincronice con la base de datos, la entidad sera removida de la misma Hay que prestar atención a las relaciones con otras entidades, para evitar problemas de integridad referencial Ejemplo: 47

48 JPA - EntityManager Transacciones En Java SE se debe usar transacciones que son manejadas explícitamente por la aplicación Se usa la interfaz EntityTransaction: 48

49 JPA - EntityManager Transacciones Ejemplo: 49

50 JPA - EntityManager Consultas En JPA, utilizamos consultas orientadas a objetos, aplicadas sobre las entidades, sus propiedades y sus relaciones El lenguaje utilizado se denomina Java Persistence Query Language (JPQL) El procesador de consultas de JPA, transforma una consulta JPQL en una consulta SQL Las consultas pueden ser de tipo Query, obteniéndose a través de la interfaz EntityManager 50

51 JPA - EntityManager Consultas Una consulta JPQL admite los siguientes elementos: SELECT FROM WHERE ORDER BY GROUP BY HAVING 51

52 JPA - EntityManager Consultas Obtengo todas las entidades Item 52

53 JPA - EntityManager Consultas Parámetro usando notación posicional 53

54 JPA - EntityManager Consultas Parámetro usando notación named 54

55 JPA - Empaquetado Persistence Unit Se define en un archivo XML denominado persistence.xml Cada Persistence Unit tiene un nombre único, el cual es usado por la aplicación para referirse a la misma Dentro del archivo persistence.xml pueden definirse todas las unidades que se requieran, siendo cada una de estas independiente 55

56 JPA - Empaquetado persistence.xml 56

57 JPA - Empaquetado Persistence Archive Los artefactos de persistencia son empaquetados en lo que denominamos un Persistence Archive Es un archivo JAR tradicional que: Contiene el archivo persistence.xml dentro de la carpeta META-INF Contiene los.class de las entidades que se persistirán 57

58 JPA - Empaquetado Ejecutando la aplicación Necesitamos colocar en el classpath los siguientes elementos: El JAR de la aplicación con el Persistence Archive Los JARs de JPA Los JARs de los proveedores de persistencia El driver de conexión a la base de datos 58

59 Ejemplo Implementación JPA EclipseLink Base de datos HSQLDB 59

Sitemap