Clase 3 - Persist en CIA, Object Relational Mapping, Java Persistence API

download Clase 3 - Persist en CIA, Object Relational Mapping, Java Persistence API

of 106

Transcript of Clase 3 - Persist en CIA, Object Relational Mapping, Java Persistence API

Taller de Sistemas de Informacin 2Persistencia Object Relational Mapping Java Persistence API

Soporte Java para persistenciaSoluciones propietariasHace tiempo existen soluciones para la resolucin de problemas de ORM Se originan en el mundo Smalltalk Hibernate, Toplink, EclipseLink

JDBCIncorporada dentro del JDK para abstraernos del API de conectividad propietaria del DBMS Es de bajo nivel SQL es portable..... mas o menosINCO - Facultad de Ingeniera Montevideo, Uruguay 2

Soporte Java para persistenciaEnterprise JavaBeansIntroducida en la primera liberacin de J2EE Eran demasiado para el problema que trataban de resolver Presentaban una complejidad excesiva, y dependencia con el proveedor del software de base Se asumi que las herramientas de desarrollo proveeran el soporte necesario para disminuir la complejidad de desarrolloINCO - Facultad de Ingeniera Montevideo, Uruguay 3

Soporte Java para persistenciaJava Data ObjectsComo intento de sobreponerse al fallo de EJB, se intento crear otra API de persistencia El problema es que fue inspirada e impulsada por los desarrolladores de bases de datos orientadas a objetos (OODB) Se basaba en la modificacin de los objetos de dominio a nivel de bytecode Esto, y el lenguaje de consulta utilizado, no gusto mucho entre los desarrolladores relacionalesINCO - Facultad de Ingeniera Montevideo, Uruguay 4

JDBCEs un APIJava DataBase Connectivity

Diseado para simplificar tareas diarias con la base de datos Permite codificar consultas de acceso y modificacin a la base de datos en SQL Retorna resultados a travs de una interfaz similar

INCO - Facultad de Ingeniera Montevideo, Uruguay

5

Arquitectura de JDBCEl codigo Java invoca una biblioteca JDBC JDBC carga a la JVM un driver El driver se encarga de hablar con un DBMS particular

Application

JDBC

Driver

INCO - Facultad de Ingeniera Montevideo, Uruguay

6

Tipos de drivers JDBCTipo I Bridge Tipo II Native JDBC Tipo III Middleware Middleware Server ODBC ODBC Driver

CLI (.lib)

Tipo IV PureINCO - Facultad de Ingeniera Montevideo, Uruguay 7

Object Relational mappingLa tcnica que permite llenar el vaco entre el modelo relacional y el modelo orientado a objetos, de denomina object relational mappingTambin conocido como O-R mapping u ORM

Introducimos un mediador, encargado de mapear automticamente los conceptos de un modelo en el otro

INCO - Facultad de Ingeniera Montevideo, Uruguay

8

Solucin idealObjetos, no tablasLas aplicaciones deben ser escritas en trminos del modelo de dominio, y no de las tablas del modelo relacional

Conveniencia, no ignoranciaEl objetivo del ORM es aliviar la cantidad de trabajo necesario para lograr el mapping No es el objetivo aislar completamente al desarrollador de los problemas de persistencia

INCO - Facultad de Ingeniera Montevideo, Uruguay

9

Solucin idealNo intrusivo, pero no transparenteNo es razonable suponer que la persistencia sea transparente, ya que una aplicacin necesita controlar cuando sus objetos son persistidos, controlando su ciclo de vida Sin embargo, la solucin no debe contaminar el modelo de dominio, por ejemplo obligando a extender una clase o implementar una interfaz para poder persistir un objeto

INCO - Facultad de Ingeniera Montevideo, Uruguay

10

Solucin idealEsquemas legadosEn general el tiempo de vida de las bases de datos es mayor que el de los sistemas que operan sobre estas Cualquier solucin deber trabajar con un esquema de base de datos ya existente

LivianoLa solucin debe ser liviana, no introduciendo un overhead grande para resolver un problema de persistenciaINCO - Facultad de Ingeniera Montevideo, Uruguay 11

Impedance MismatchLa diferencia entre el modelo relacional y el modelo orientado a objetos, se denomina Impedance Mismatch El problema de mapear uno en otro, no surge debido a las similaridades, sino a las diferencias entre ambos modelos Veamos algunos ejemplos...

INCO - Facultad de Ingeniera Montevideo, Uruguay

12

Impedance Mismatch

INCO - Facultad de Ingeniera Montevideo, Uruguay

13

Impedance Mismatch

INCO - Facultad de Ingeniera Montevideo, Uruguay

14

Impedance Mismatch

INCO - Facultad de Ingeniera Montevideo, Uruguay

15

Impedance Mismatch

INCO - Facultad de Ingeniera Montevideo, Uruguay

16

Impedance Mismatch

INCO - Facultad de Ingeniera Montevideo, Uruguay

17

Impedance Mismatch

INCO - Facultad de Ingeniera Montevideo, Uruguay

18

Java Persistence APIEs un framework liviano para persistencia basada en POJOs Ofrece una buena solucin para integrar soporte de persistencia en aplicaciones de todo tipo Surge originalmente de la mano de EJB 3.0, adoptando la experiencia de aos de uso de Hibernate y Toplink, seguidos luego por JDO

INCO - Facultad de Ingeniera Montevideo, Uruguay

19

Java Persistence APIPersistencia basada en POJOsLos objetos que se persisten no tienen ninguna caracterstica particular No deben extender clases base o implementar interfaces especiales La persistencia esta guiada por metadatos, ya sea en anotaciones o en XML Los objetos son solamente tan pesados como los datos que acarrean

INCO - Facultad de Ingeniera Montevideo, Uruguay

20

Java Persistence APINo intrusivaEl API de persistencia existe en una capa diferente a los objetos persistentes El API de persistencia es invocada desde la lgica de negocio de la aplicacin, envindole desde esta los objetos persistentes, junto con instrucciones para operar con estos No hay que confundir persistencia no intrusiva con persistencia transparente

INCO - Facultad de Ingeniera Montevideo, Uruguay

21

Java Persistence APIConsultas orientadas a objetosProvee un mecanismo potente para realizar consultas, recorriendo los objetos, sus propiedades y sus relaciones, sin necesidad de conocer columnas o claves forneas a nivel de la base de datos Las consultas eventualmente sern traducidas a SQL por el framework de consultas de JPA

INCO - Facultad de Ingeniera Montevideo, Uruguay

22

Java Persistence APIEntidades mvilesLos objetos de negocio, los elementos del modelo de dominio deben poder atravesar las diferentes capas de una aplicacin

Configuracin simpleBasada en XML o anotaciones Gran uso de valores por defecto En ciertos casos, podemos llegar a no utilizar metadatos

INCO - Facultad de Ingeniera Montevideo, Uruguay

23

EntidadesEs un sustantivo en nuestro modelo de negocio Es una agrupacin de estado, asociado como una sola unidad Una entidad puede participar en cualquier numero de relaciones con otras entidades En el mundo OO, se le puede agregar comportamientoEs lo que generalmente denominamos ObjetosINCO - Facultad de Ingeniera Montevideo, Uruguay 24

EntidadesEn JPA cualquier objeto de aplicacin puede ser una entidad Existen una serie de caractersticas que determinan que dicho objeto pueda ser denominado entidadPersistibles Identidad Transaccionalidad Granularidad apreciableINCO - Facultad de Ingeniera Montevideo, Uruguay 25

MetadatosAdems del estado persistente, las entidades tienen asociado un conjunto de metadatos Existen dos formas de definir metadatos, en forma de Anotaciones Java y en forma de XML Los metadatos en JPA siguen el estilo de configuracin por excepcinSe utilizan valores por defecto que aplican a la mayora de las aplicaciones Solo debemos configurar, cuando se aparta del valor por defectoINCO - Facultad de Ingeniera Montevideo, Uruguay 26

Clase Employee

INCO - Facultad de Ingeniera Montevideo, Uruguay

27

Entidad Employee

INCO - Facultad de Ingeniera Montevideo, Uruguay

28

Conceptos de JPA

INCO - Facultad de Ingeniera Montevideo, Uruguay

29

Conceptos de JPAEl API de persistencia se encuentra implementada en una clase denominada EntityManager, representada por la interfaz EntityManager Los EntityManager son producidos por instancias de EntityManagerFactory Una Persistence Unit define las entidades utilizadas o administradas por un EntityManagerINCO - Facultad de Ingeniera Montevideo, Uruguay 30

Obteniendo un EntityManagerExisten diversas formas de obtener un EntityManager, segn si estamos en Java SE o Java EE En Java SE, podemos usar la clase de bootstrap Persistence

INCO - Facultad de Ingeniera Montevideo, Uruguay

31

Persistiendo una entidadLuego de que tenemos el EntityManger instanciado, podemos empezar a usar las funciones que este provee

INCO - Facultad de Ingeniera Montevideo, Uruguay

32

Buscando y removiendo...

INCO - Facultad de Ingeniera Montevideo, Uruguay

33

Actualizando una entidadUna vez que la entidad esta asociada al EntityManager, podemos realizar actualizaciones automticas..

INCO - Facultad de Ingeniera Montevideo, Uruguay

34

TransaccionesSegn el contexto en el que ejecuta una aplicacin, la forma de iniciar/terminar transacciones puede variar En Java SE, debemos hacer esto explcitamente

INCO - Facultad de Ingeniera Montevideo, Uruguay

35

ConsultasEn algn momento en nuestra aplicacin, deberemos utilizar consultas sobre la base de datos para recuperar informacin En JPA, utilizamos consultas orientadas a objetos, aplicadas sobre las entidades, sus propiedades y sus relaciones Este lenguaje se denomina Java Persistence Query Language (JPQL) Las consultas pueden ser de tipo Query, obtenindose a travs de la interfaz EntityManagerINCO - Facultad de Ingeniera Montevideo, Uruguay 36

ConsultasPor ejemplo, un mtodo para recuperar los empleados de la aplicacin

INCO - Facultad de Ingeniera Montevideo, Uruguay

37

INCO - Facultad de Ingeniera Montevideo, Uruguay

38

EmpaquetadoCon los elementos anteriores, tenemos las piezas basicas de una aplicacin JPA Debemos combinar dichas piezas para lograr una aplicacin que funcione primero en Java SE Para esto, lo primero a definir es la Persistence Unit

INCO - Facultad de Ingeniera Montevideo, Uruguay

39

Persistence UnitSe define un archivo XML denominado persistence.xml Cada Persistence Unit tiene un nombre nico, el cual es usado por la aplicacin para referirse a la misma Dentro del archivo persistence.xml pueden definirse todas las unidades que se requieran, siendo cada una de estas independienteINCO - Facultad de Ingeniera Montevideo, Uruguay 40

persistence.xml

INCO - Facultad de Ingeniera Montevideo, Uruguay

41

Persistence ArchiveLos 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 persistirn

INCO - Facultad de Ingeniera Montevideo, Uruguay

42

Ejecutando la aplicacinSolo necesitamos colocar en el classpath los siguientes elementos:El JAR de la aplicacin con el Persistence Archive Los JARs de JPA Los JARs de los proveedores de persistencia El driver de conexin a la base de datos

INCO - Facultad de Ingeniera Montevideo, Uruguay

43

ORMUno de los aspectos mas importantes de cualquier solucin de ORM, es la configuracin que permite mapear el estado de las entidades en la base de datos Esta informacin de configuracin se presenta en forma de anotaciones, las cuales son colocadas dentro de las entidades

INCO - Facultad de Ingeniera Montevideo, Uruguay

44

Mapeando a una tablaCuando queremos mapear una entidad a una tabla especifica, entonces debemos utilizar la anotacin @Table Esto debe hacerse, cuando el nombre de la tabla no coincide con el de la entidad

INCO - Facultad de Ingeniera Montevideo, Uruguay

45

Mapeando a una tablaTambin podemos definir una esquema o un catalogo asociado a una tabla

INCO - Facultad de Ingeniera Montevideo, Uruguay

46

Mapeando tipos simplesPrimitive Java types: byte, int, short, long, boolean, char, float, double Wrapper classes of primitive Java types: Byte, Integer, Short, Long, Boolean, Character, Float, Double Byte and character array types: byte[], Byte[], char[], Character[] Large numeric types: java.math.BigInteger, java.math.BigDecimalINCO - Facultad de Ingeniera Montevideo, Uruguay 47

Mapeando tipos simplesStrings: java.lang.String Java temporal types: java.util.Date, java.util.Calendar JDBC temporal types: java.sql.Date, java.sql.Time, java.sql.Timestamp Enumerated types: Cualquier enumerado definido por el sistema o el usuario Serializable objects: Cualquier tipo de datos del sistema o del usuario, serializableINCO - Facultad de Ingeniera Montevideo, Uruguay 48

Mapeando columnasUsamos la anotacin @Column sobre las propiedades o campos

INCO - Facultad de Ingeniera Montevideo, Uruguay

49

Fetching de camposPodemos definir el momento en el que se cargan los campos de una entidad

INCO - Facultad de Ingeniera Montevideo, Uruguay

50

Large Objects

INCO - Facultad de Ingeniera Montevideo, Uruguay

51

Tipos enumerados (ordinales)

INCO - Facultad de Ingeniera Montevideo, Uruguay

52

Tipos enumerados (strings)

INCO - Facultad de Ingeniera Montevideo, Uruguay

53

Temporal typesSe soportan java.sql.Date, java.sql.Time, java.sql.Timestamp y los tipos java.util.Date y java.util.Calendar

INCO - Facultad de Ingeniera Montevideo, Uruguay

54

Transient stateSe utiliza la anotacin @Transient para indicar que un atributo no forma parte del estado persistente de un objeto

INCO - Facultad de Ingeniera Montevideo, Uruguay

55

Primary KeyToda entidad persistente debe tener asociado un campo que declare la clave primaria en la tabla a la cual se mapea dicha entidad Las claves primarias son insertables, pero no actualizables ni eliminables Salvo por la caracterstica especial de ser clave primaria, un campo de estas caractersticas, puede ser cualquier tipo simple de los mapeados por JPAINCO - Facultad de Ingeniera Montevideo, Uruguay 56

Primary Key TypesTipos Java primitivos: byte, int, short, long, char Wrapper classes de tipos Java primitivos: Byte, Integer, Short, Long, Character String: java.lang.String Large numeric type: java.math.BigInteger Temporal types: java.util.Date, java.sql.Date Se permiten tipos flotantes y BigDecimal, pero no se recomienda por la naturaleza no confiable del redondeoINCO - Facultad de Ingeniera Montevideo, Uruguay 57

Generacin de identificadoresA veces las aplicaciones deciden desentenderse de la generacin automtica de los identificadores Esto se logra a travs de la anotacin @GeneratedValue, usada en combinacin con la anotacin @Id Dependiendo de la forma en que se genera, no podemos confiar en que el valor este presente hasta que la transaccin sea completadaINCO - Facultad de Ingeniera Montevideo, Uruguay 58

Generacin automticaSi nos interesa la forma en que se generan los identificadores, sino solamente que se genere uno automticamente, entonces podemos usar GenerationType.AUTO Puede requerir permisos de DBA, para poder utilizar el mecanismo apropiado (por ej. Crear una Tabla)

INCO - Facultad de Ingeniera Montevideo, Uruguay

59

Generacin usando tablas

INCO - Facultad de Ingeniera Montevideo, Uruguay

60

Generacin usando secuencias

INCO - Facultad de Ingeniera Montevideo, Uruguay

61

Generacin usando identidadesSe utiliza el valor GenerationType.IDENTITY Requiere que a nivel de esquema se soporten tipos identidad El identificador no esta disponible hasta luego de que se confirme la transaccin

INCO - Facultad de Ingeniera Montevideo, Uruguay

62

Conceptos en relacionesRoles

INCO - Facultad de Ingeniera Montevideo, Uruguay

63

Conceptos en relacionesDireccionalidad

INCO - Facultad de Ingeniera Montevideo, Uruguay

64

Conceptos en relacionesCardinalidad

INCO - Facultad de Ingeniera Montevideo, Uruguay

65

Conceptos en relacionesOpcionalidadPermite indicar si un rol esta presente o no Indica si al momento de crear una entidad, la entidad relacionada debe estar presente o no

INCO - Facultad de Ingeniera Montevideo, Uruguay

66

Conceptos en relacionesTipos de relacionesMany-to-one One-to-one One-to-many Many-to-many

INCO - Facultad de Ingeniera Montevideo, Uruguay

67

Many-to-one

INCO - Facultad de Ingeniera Montevideo, Uruguay

68

Many-to-onePara indicar las columnas que permiten realizar el join a nivel de la base de datos, utilizamos la anotacion @JoinColumn

INCO - Facultad de Ingeniera Montevideo, Uruguay

69

One-to-one

INCO - Facultad de Ingeniera Montevideo, Uruguay

70

One-to-one

INCO - Facultad de Ingeniera Montevideo, Uruguay

71

One-to-one bidireccional

INCO - Facultad de Ingeniera Montevideo, Uruguay

72

mappedByEste atributo debe ser especificado en la entidad que no define una @JoinColumn Esto es lo que se denomina el lado inverso de la relacion mappedBy no puede ser especificado de ambos lados de la relacion

INCO - Facultad de Ingeniera Montevideo, Uruguay

73

One-to-many

INCO - Facultad de Ingeniera Montevideo, Uruguay

74

Many-to-many

INCO - Facultad de Ingeniera Montevideo, Uruguay

75

Join Tables

INCO - Facultad de Ingeniera Montevideo, Uruguay

76

One-to-many unidireccionales

INCO - Facultad de Ingeniera Montevideo, Uruguay

77

One-to-many unidireccionales

INCO - Facultad de Ingeniera Montevideo, Uruguay

78

Relaciones lazyEl fetch mode regula la forma en que los objetos participantes de una relacion son cargados a memoria Los cuatro tipos de relaciones permiten especificar el fetch mode Este puede ser EAGER o LAZYLas relaciones monovaluadas son EAGER por defecto Las relaciones multivaluadas son LAZY por defectoINCO - Facultad de Ingeniera Montevideo, Uruguay 79

Relaciones lazy

INCO - Facultad de Ingeniera Montevideo, Uruguay

80

QueriesLa consulta mas simple que podemos hacer en JPQL, selecciona todas las entidades de un determinado tipo La principal diferencia entre SQL y JPQL, es que elegimos entidades del dominio, y no tablas

INCO - Facultad de Ingeniera Montevideo, Uruguay

81

QueriesUsando la notacin de . podemos navegar las relaciones y atributos de una entidad, aun si esta no esta referenciada en el FROM

INCO - Facultad de Ingeniera Montevideo, Uruguay

82

QueriesPodemos filtrar los resultados utilizando el WHERE como en SQL La diferencia como antes, es que usamos expresiones con entidades, en vez de expresiones con columnas

INCO - Facultad de Ingeniera Montevideo, Uruguay

83

QueriesEn un SELECT, no podemos devolver colecciones de entidades, siempre debe ser un valor monovaluado Podemos realizar JOINs entre entidades para obtener elementos relacionados

INCO - Facultad de Ingeniera Montevideo, Uruguay

84

QueriesSi entre dos entidades existe una relacin (como el caso anterior), es posible usar el operador JOIN en el FROM Este operador realiza el join, pero tambin provee las condiciones de joineo en forma automtica, sin que tengamos que especificarlo

INCO - Facultad de Ingeniera Montevideo, Uruguay

85

QueriesSe soportan las funciones de agregacin presentes siguientes (como en el caso SQL)AVG, COUNT, MIN, MAX, SUM

Los resultados pueden agruparse utilizando GROUP BY

INCO - Facultad de Ingeniera Montevideo, Uruguay

86

Consultas dinmicasEste tipo de consultas puede definirse pasando el string JPQL al mtodo createQuery del entity manager No hay restricciones en la definicin de la query Debemos tener en cuenta, que cada invocacin de estas, implica analizar y parsear la consulta Si bien en general se usan caches para consultas, podra verse afectado su uso segun la forma de utilizar la consultaINCO - Facultad de Ingeniera Montevideo, Uruguay 87

Consultas dinmicasEste es un ejemplo de consulta dinmica..

INCO - Facultad de Ingeniera Montevideo, Uruguay

88

Utilizando parmetros

INCO - Facultad de Ingeniera Montevideo, Uruguay

89

Consultas nombradasLas named queries son un mecanismo til para organizar las consultas de una aplicacin, as como para aumentar la performance de una aplicacin Usamos la anotacin @NamedQuery, colocndola en cualquier entidad de la aplicacin En general se coloca la query en la entidad que corresponde mas directamente con la consultaINCO - Facultad de Ingeniera Montevideo, Uruguay 90

Consultas nombradas

INCO - Facultad de Ingeniera Montevideo, Uruguay

91

Consultas nombradasEl nombre de la consulta debe ser nico en todo el persistence unit Es comn usar el nombre de la entidad como prefijo para evitar problemasEmployee.findAll, en vez de findAll

A nivel de especificacin, no esta definido que ocurre cuando hay un conflicto de nombresLas opciones son un error en deployment, o la sobre escritura de una de las consultasINCO - Facultad de Ingeniera Montevideo, Uruguay 92

Consultas nombradasSe puede definir mas de una consulta Para esto utilizamos la anotacin @NamedQueries

INCO - Facultad de Ingeniera Montevideo, Uruguay

93

Consultas nombradasEl string de este tipo de consultas no puede ser alterado por el programa Cualquier variacin en la forma en que la consulta recupera los datos, debe hacerse a travs del uso de parmetros Para utilizar una de estas consultas, debemos utilizar el mtodo createNamedQuery, del entity manager

INCO - Facultad de Ingeniera Montevideo, Uruguay

94

Consultas nombradas

INCO - Facultad de Ingeniera Montevideo, Uruguay

95

Tipos de parmetrosJPA soporta parmetros nombrados y posicionales Usamos el mtodo setParameter() de la interfaz Query o TypedQueryEl primer argumento es el nombre o la posicion El segundo parametro es el valor Para el caso de fechas, se necesita un tercer valor, indicando el tipo de fecha: java.sql.Date, java.sql.Time, java.sql.TimeStamp

INCO - Facultad de Ingeniera Montevideo, Uruguay

96

Tipos de parmetros

INCO - Facultad de Ingeniera Montevideo, Uruguay

97

Tipos de parmetrosUn aspecto interesante de JPQL, es que podemos utilizar como parmetro entidades completas En el caso de las fechas, debemos especificar el tipo de argumento temporal utilizado Para esto, usamos el enumerado TemporalType

INCO - Facultad de Ingeniera Montevideo, Uruguay

98

Tipos de parmetros

INCO - Facultad de Ingeniera Montevideo, Uruguay

99

Tipos de parmetrosEl mismo parmetro puede ser usado mltiples veces

INCO - Facultad de Ingeniera Montevideo, Uruguay

100

Ejecutando consultasQuery y TypedQuery proveen tres formas de ejecutar consultas, dependiendo de la cantidad de resultados esperados Para consultas que retornan valores, podemos invocargetSingleResult() si se espera un solo resultado getResultList() si se espera mas de un valor

Para actualizaciones podemos usar executeUpdate()INCO - Facultad de Ingeniera Montevideo, Uruguay 101

Ejecutando consultas

INCO - Facultad de Ingeniera Montevideo, Uruguay

102

Resultados de una consultaEl tipo resultado de la consulta depende de las expresiones utilizadas en el SELECT Por ejemplo, si el resultado del SELECT es de tipo Employee, entonces getResultList() devolver una lista de Employee Algunos posibles resultadosTipos bsicos como String o primitivos Tipos de entidad Array de Object Tipos definidos por el usuario, a traves del uso del newINCO - Facultad de Ingeniera Montevideo, Uruguay 103

Resultados de una consulta

INCO - Facultad de Ingeniera Montevideo, Uruguay

104

Resultados de una consultaEs posible definir una clase utilitaria para almacenar los valores devueltos por la consulta Esta clase definida debe poseer un constructor que concuerde en cantidad y tipos con los elementos devueltos por el SELECT Para crear una nueva instancia de esta clase, usamos el operador NEW a continuacin del SELECTINCO - Facultad de Ingeniera Montevideo, Uruguay 105

Bulk delete

INCO - Facultad de Ingeniera Montevideo, Uruguay

106