JPA2 y MyBatis 3
JPA2 y MyBatis 3
JPA2 y MyBatis 3
Componentes:
1. Entity Objects (entidades)
Objeto persistente del modelo de dominio, con las caractersticas de un
POJO, que ha sido mapeada a una Tabla de BD aplicando ORM, donde cada
instancia representa un registro en la Tabla, por lo cual tiene un objeto
identificador nico (Llave primaria) que le da identidad y maneja un conjunto
de estados a travs de sus propiedades persistentes (setter/getter) o campos
persistentes (variables de instancia).
El ORM consiste en asociar Metadata a las entidades lo cual se realiza con
Anotaciones o XML. JPA 2 con Hibernate 6
En general son POJO mapeados con anotacin @Entity
El estado de persistencia de una entidad se representa a travs de
campos persistentes o propiedades persistentes.
Los campos persistentes o mtodos getter de propiedades persistentes
pueden tener definido el mapeo con Anotaciones.
No se consideran para la persistencia aquellos campos que estn
mapeados con la anotacin @Transient.
La identidad de una entidad puede estar definida con uno o ms
campos persistentes o propiedades persistentes.
Debe tener como mnimo mtodo constructor sin argumentos.
Tanto la clase como sus mtodos o campos persistentes no pueden
ser final.
Campos persistentes son private o protected.
Pueden heredar otras entidades y no entidades.
Son transaccionales.
Los campos o propiedades persistentes pueden ser los siguientes:
Datos primitivos
Objetos serializados por ejemplo String, Integer, Date, byte[], etc.
Enumeraciones
Otras entidades o coleccin de entidades.
Clases embebidas.
2. Entity Manager
Es un API que gestiona el ciclo de vida de las instancias de Entidades y
permite realizar operaciones con BD, por ejemplo persistir el estado de la
entidad u obtener datos de una Entidad.
Las entidades gestionadas por el Entity Manager son denominadas managed
(attached).
Su implementacin se basa en la interfaz EntityManager que define los
mtodos que sern usados para sincronizar la informacin entre las Entidades
y la BD cuando el Entity Manager lo solicite.
Una Entidad que no est gestionada por el Entity Manager no es un objeto
persistente, por tanto su estado no ser controlado ni sincronizado en BD,
siendo solo una clase java simple en caso de ser nuevas instancias o
detached si previamente fueron managed.
Una instancia de EntityManager est asociada solo a un nico Persistence
Context.
b. Persistence Unit
Una unidad de persistencia define la configuracin y entidades que
sern gestionadas por los Entity Managers. Ello se realiza en un archivo
llamado persistence.xml.
La relacin entre un Persistence Unit y un Entity Manager Factory es de
uno a uno.
c. Persistence Context
Contiene un conjunto de instancias de Entidades managed, por tanto
est asociado a un Entity Manager.
Entidades que salen del Persistence Context se les denomina
detached.
No es visible en la aplicacin pero se accede indirectamente a travs
del Entity Manager.
En un mismo Persistence Context no puede haber dos instancias de
Entidades con la misma identidad.
Tiene dos tipos de scope:
a) Transaction-scoped Persistence Context
Su tiempo de vida est asociado con la duracin de una transaccin.
Cuando un mtodo de negocio inicia su ejecucin, al primer uso del
Entity Manager se crea el Persistence Context con las instancias de
Entidades managed.
Posteriores usos de instancia del EntityManager dentro de la misma
transaccin reutilizan el Persistence Context.
Al terminar una transaccin (commit o rollback), se persisten los
cambios de estado de las entidades y luego dichas entidades se
vuelven detached, es decir dejan de estar asociadas al
Persistence Context y ya no son gestionadas por el
EntityManager.
Finalmente, el Persistence Context asociado es cerrado.
Se puede utilizar solo cuando un contenedor gestiona los Entity
Manager con transaccin JTA.
b) Extended-scoped Persistence Context
Su tiempo de vida es independiente al de una transaccin. Por tanto,
el mismo Persistence Context se puede utilizar en mltiples
transacciones de un proceso de negocio manteniendo en
managed las instancias de Entidades asociadas.
Utilizado en Statefull Session Bean.
Cuando Persistence Context es cerrado, las instancias de entidades
se vuelven detached.
JPA maneja dos niveles de Cach. El Persistence Context acta
como First Level Cache mientras dura una transaccin
(Transaction-scoped) o mientras est activa la instancia del Entity
Manager (Extendedscoped).
Configuracin Bsica
1. Archivos de Configuracin: persistence.xml (requerido)
2. Entidad
En el curso para aplicar ORM vamos a realizar la configuracin de metadata
con
Anotaciones.
Anotaciones
Permite definir metadatos a elementos de un programa Java. Estos metadatos
estarn disponibles en tiempo de ejecucin permitiendo a otros programas
determinar cmo interactuar con los elementos del programa.
Sintaxis: @NombreAnotacion (atributos)
Las anotaciones se pueden aplicar a Clases Java, mtodos, variables de
instancia, parmetros, etc.
En JPA se tiene definido un conjunto de Anotaciones de Persistencia
personalizadas, que en su mayora realizan una configuracin equivalente al
uso de archivos externos (XML). En este caso, se puede aplicar a nivel de
Clase, mtodos y variables de instancia.
Aqu mencionaremos las Anotaciones mnimas necesarias para aplicar
ORM.
@Entity: Indica que la clase es persistente.
@Id: Indica el campo identificador de la clase que representa la llave
primaria en la tabla
Por defecto, todos los campos de la Entidad son persistentes.
Dado que el nombre de la clase y campos persistentes son idnticos al nombre
de la tabla y columnas, respectivamente, el mapeo es automtico y no se
requiere mayor configuracin por el momento.
4. Entity Manager
Una vez terminado el ORM y definido el tipo de gestin del Entity Manager,
se procede a implementar las operaciones bsicas del CRUD utilizando el
Entity Manager.
Las operaciones principales son las siguientes:
persist
Convierte una instancia nueva de una Entidad en managed volvindola
persistente.
Su estado se sincronizar con BD al ejecutar el commit de la transaccin o
antes de ello, ejecutando el mtodo flush() del Entity Manager.
remove
Remueve una instancia de Entidad managed y queda en espera para su
sincronizacin.
Su estado se sincronizar con BD al ejecutar el commit de la transaccin
o antes de ello, ejecutando el mtodo flush() del Entity Manager.
merge
Convierte en managed instancias detached o nuevas.
Su caracterstica principal es que puede trabajar con instancias detached
o instancias nuevas, segn ello en la BD persistir los cambios o crear
un nuevo registro.
Su estado se sincronizar con la BD al ejecutar el commit de la
transaccin o antes de ello, ejecutando el mtodo flush() del Entity
Manager.
Tpicamente es usado en el siguiente escenario:
find
Busca en BD una Entidad a travs de su llave primaria. De encontrarla
asocia su instancia al Persistence Context, por tanto es managed. Al
cerrar el Persistence Context, instancia se vuelve detached.
flush
Sincroniza el Persistence Context con la BD.
Los cambios de estado realizados en las Entidades managed durante
una transaccin son sincronizados antes de que se ejecute el commit de
la misma.
Por ejemplo, si durante una transaccin, se ejecut el mtodo persist()
para una nueva instancia de Entidad, est instancia permanecer en el
Persistence Context esperando su sincronizacin con la BD hasta que se
ejecute el mtodo flush() o el commit de la transaccin.
clear
Limpia el Persistence Context, volviendo todas las instancias managed
en detached. Los cambios de estado que no hayan sido sincronizados
previamente se perdern.
detach
Quita una instancia de Entidad managed del Persistence Context
convirtindola en detached sin necesidad de esperar a que el
PersistenceContext sea cerrado.
Ciclo de Vida
Registro
Actualizacin
Eliminacin
Lectura
ii.
Atributos
@Basic: Anotacin que se asigna por defecto a todos los atributos de
una Entidad, por lo cual JPA asume que todos los atributos son
persistentes. Se utiliza para definir estrategias de Fetch e indicar si el
campo es opcional. El FetchType recomendado para este tipo de
atributos es EAGER, el cual viene configurado por defecto.
@Column: Permite definir caractersticas fsicas de una columna de la
tabla asociada a la entidad. Por ejemplo, si el nombre del atributo es
distinto del de la columna, se debe utilizar el nombre de la columna en
atributo name para que la referencia de mapeo sea correcta. Tambin,
permite configurar si el atributo debe incluirse en la sentencia INSERT o
UPDATE con los atributos insertable updatable respectivamente.
@Embedded: Anotacin que se asigna a los atributos asociados a un
componente @Embeddable. En un componente @Embeddable se
definen atributos que son parte de una o ms Entidades y no representa
una tabla por s sola.
Dichos atributos pueden ser parte de Entidades como Cliente,
Empleado, Proveedor, etc; por tanto, una de sus caractersticas es ser
reutilizable. Cada Entidad puede agregar los atributos del componente
como un atributo ms, haciendo uso de la anotacin @Embedded.
Asimismo, en la Entidad se puede sobreescribir la configuracin de
cada atributo con la anotacin @AtributeOverrides.
@Temporal:
Utilizado
en
atributos
tipo
java.util.Date
o
java.util.Calendar para indicar la precisin de fecha requerida por la
columna en BD.
Precisiones:
DATE
TIME
TIMESTAMP
Ello es equivalente a utilizar clases del paquete java.sql.*(Date, Time y
Timestamp) para las cuales no se requiere el uso de esta anotacin por
ser especficas.
@Transient: Permite definir atributos No persistentes en un Entidad, es
decir sern ignorados por JPA. Se refiere a atributos usados en tiempo
de ejecucin cuyo valor solo es utilizado/calculado por una funcin
especfica y no requiere ser almacenado en BD.
3. Fetch
Fetch se refiere a la estrategia definida en cada atributo de Entidad para
obtener su valor desde la BD. Hay dos tipos y son los siguientes:
EAGER: Los datos son obtenidos desde BD en un solo query al momento
de cargar una Entidad.
LAZY: El dato es obtenido desde BD la primera vez que se accede al
atributo. Es decir, al cargar una instancia de Entidad desde BD, el query no
incluir aquellas columnas que estn mapeadas como LAZY en la Entidad.
Luego de cargada la instancia de Entidad, la primera vez que se acceda a
un atributo LAZY, se generar un nuevo query para obtener desde BD su
respectivo valor.
Usos:
Una forma de categorizar los tipos de consulta puede ser con JPQL dinmico.
JPQL DINMICO
Una consulta JPQL se define en un objeto STRING utilizando
concatenaciones.
Permite definir consultas dinmicas, por ejemplo una misma consulta
puede tener uno o ms filtros segn seleccin de usuario final. Ello implica
que el servidor no conozca de antemano cuales son las consultas definidas
para la aplicacin; por lo cual, el API de JPA primero debe compilar el JPQL
cada vez que se solicite su ejecucin. Otra desventaja es que por el hecho
de establecer valores dinmicamente es propenso a SQL Injection.
Para evitar SQL Injection se recomienda uso de Named Parameters u
Ordinal (Positional) Parameters.
Named Parameters
Positional Parameters
NAMED QUERIES
Permite definir consultas estticas.
Se define a nivel de Entidad utilizando las Anotaciones
@NamedQueries y @NamedQuery o con XML. Cada consulta tendr
asociado un identificador indicado con el atributo name.
Los parmetros de la consulta deben ser NamedParameter o
PositionalParameter.
Los query se compilan y mantienen en memoria desde el momento
en que se carga la aplicacin en el servidor.
Para casos de consulta a BD para reportes con datos de dos o ms tablas
tenemos las siguientes estrategias:
Obtener
Entidades
cuyas
relaciones
son
EAGER.
(NO
RECOMENDADO).
Obtener Entidades cuyas relaciones son LAZY e ir accediendo a dichos
atributos a demanda antes de que sea DETACHED. (NO
RECOMENDADO).
Obtener Entidades cuyas relaciones son LAZY, pero sobre-escribiendo
temporalmente el FETCH en el JPQL.
Mantener Persistence Context activo durante el procesamiento del
request para su uso en todas las capas y no tener error por lazy
loading.
Usar JPQL projections (Es el ms recomendado).