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
Top Related