Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema5 2
Tema5 2
0 y Entidades JPA
Tecnolog de JEE 5 para dar soporte a los componentes que forman as la capa de negocio 1. Soporte de persistencia: mediante entidades JPA
(Java Persistence API )
Objetos Java cuyo estado (valores de atributos) se almacena en BDs permanentes Representan los objetos de dominio persistentes manejados por la aplicacin o JEE
Encapsulan los datos manejados por la aplicacin cuyo almacenamiento gestiona la capa o de datos
JPA ofrece facilidades de mapeo Objeto-Relacional que ocultan el manejo de bases de datos SQL No son excusivos de JEE ni de la capa de negocio puede usarse JPA en aplicaciones JSE (de escritorio)
Manejo de transacciones para controlar accesos concurrentes asegurando la integridad de los datos
Controladas por el contenedor de EJB
Simplican el desarrollo de aplicaciones que atiendan una gran variedad de clientes (clientes web o de escritorio (stand-alone), cliente locales o remotos, etc) Diseo orientado a componentes reusabilidad y abstraccin n o
El desarrollador se concentra en la lgica de negocio y utiliza los servicios o proporcionados por el contenedor
Servicios bsicos a los que da soporte el contenedor EJB a Persistencia mediante JPA (Java Persistence API ) Invocacin remota de mtodos mediante RMI/IIOP o e Procesamiento de transacciones y control de la concurrencia
Cada invocacin de un mtodo de un EJB forma parte de una transaccin o e o
Procesamiento de eventos (API Java Message Service [JMS]) Servicios de directorio: JNDI (Java Naming and Directory Interface) Seguridad: autenticacin, control de acceso y primilegios y criptoo graf (JAAS [Java Authentication and Authorization Service] y JCE a [Java Cryptography Extension]) Publicacin de los mtodos de negocio de los EJBs como servicios o e Web (mediante JAX-WS)
FJRP, FMBR 2008-2010 ccia SCS 2
(a) Tipos de EJB Message-Driven EJBs (EJBs dirigidos por mensajes) Permiten el procesamiento de mensajes (operaciones) de forma as ncrona (recepcin y tratamiento de eventos JMS) o Actan como listeners (escuchadores) de eventos JMS (Java u Message Service)
Implementan el interfaz MessageListener
Se suscriben a una cola (queue) quedando a la espera y se activan cuando se recibe un mensaje dirigido a dicha cola
Esos mensajes JMS pueden ser enviados por cualquier componente de una aplicacin Java EE (clientes, componentes Web, otros EJBs) o Los clientes de un Message-Driven EJB no invocan directamente sus mtodos, simplemente env mensajes JMS e an
Session EJBs (EJBs de sesin) o Representan procesos de negocio (funcionalidades de la aplicacin) implementan un interfaz de negocio (bussines interface) o Gestionan la interaccin con los clientes y encapsulan el ujo y o manipulacin de la informacin en el servidor o o
Sirven a los clientes como una fachada de los servicios proporcionados por otros componentes disponibles en el servidor (patrn de diseo Facade) o n
Contenedor de EJBs crea e inicializa sus instancias (inyectndoles a las referencias necesarias) y las asigna a los clientes a medida que estos los van requiriendo (pool de EJBs) En un instante de tiempo dado, slo un cliente tiene acceso a los o mtodos de la instancia del EJB (control de concurrencia) e
Contenedor de EJBs garantiza que cada mtodo del EJB se ejecuta dentro e de una transaccin atmica o o
(b) EJBs de sesin o Tipos de EJB de sesin: en funcin la interaccin con el cliente o o o
Stateful EJB: tienen un estado conversacional dependiente del cliente Cada llamada est condicionada por las anteriores (importa el orden) a Los valores de sus atributos se mantienen entre las distintas invocaciones de un mismo cliente Representan el estado de la interaccin con un cliente espec o co Cada instancia de un stateful EJB atiende invocaciones de un unico cliente En funcin del estado conversacional el resultado de las operaciones realio zadas podr variar a Estado conversacional no es persistente (no se mantiene cuando el cliente libera el EJB) Valores de atributos no premanentes: nalizada sesin el estado desaparece o Por eciencia el contenedor de EJBs puede decidir detener temporalmente la ejecucin un stateful EJB, almacenando temporalmente su estado en o disco para recuperarlo al volver a la ejecucin o Ejemplo: objeto carrito de la compra en el cual se van aadiendo productos n Stateless EJB: no almacenan datos de los clientes que los invocan Cada llamada es independiente de las dems a Para el cliente todos los stateless EJB son idnticos e Estado de un stateless EJB no contiene informacin espec o ca de un cliente
no se garantiza que los valores de sus atributos se mantengan entre llamadas
Stateless EJBs realizan tareas genricas e idnticas para todos los clientes e e Pueden implementar Servicios Web (anotaciones @WebService y @WebMethod) Ejemplo: objeto gestor de art culos: altas, bajas, modicaciones de art culos
Interfaces en EJB de sesin o Interfaz de negocio de un EJB dene el tipo de acceso permitido a sus clientes (Dene la visin del EJB que tiene el cliente) o Un EJB de de sesin puede tener varios interfaces de negocio con o distintos tipos de acceso
Clientes remotos: pueden ejecutarse en mquinas virtuales distintas a la del a EJB que invocan
Pueden ser: componentes web (servlet, JSP), clientes remotos u otros EJBs Para el cliente remoto la localizacin del EJB es transparente o
Clientes locales: deben ejecutarse enl amisma mquina virtual que el EJB que a invocan
Pueden ser: componentes web (servlet, JSP) u otros EJBs Para el cliente local la localizacin del EJB no es transparente o
(c) Denicin de EJBs de sesin o o (1) Denicin del interfaz de negocio o Interfaces de negocio interfaces Java decorados con las anotaciones @Remote o @Local para indicar las restricciones de acceso
El interfaz y todos los mtodos denidos deben de ser public e Mismas restriciones para los tipos de parmetros y valores de retorno que a Java RMI
Si no se indica con una anotacin en el interfaz o en el EJB se o asume todos los interfaces son locales por defecto Ejemplos:
@Local @Remote public public interface CarritoCompra { public public void inicializarCarrito(Cliente c); public public void anadirArticulo(Articulo a, int cant); public public void eliminarArticulo(Articulo a); public public void vaciarCarrito(); }; }; interface GestorClientes { void alta(Cliente c); void baja(Cliente c); void actualizar(Cliente c; cliente buscarDNI(String DNI);
(2) Implementacin de EJBs de sesin o o Clases de implementacin marcadas con las anotaciones o @Stateless @Stateful segn del tipo de bean o u Se indican los interfaces de negocio implementados (implements)
@Stateless public class GestorClientesBean implements GestorClientes { ... } @Stateful public class CarritoCompraBean implements CarritoCompra { ... }
Opcionalmente se puede asociar un nombre JDNI al EJB para su acceso (parmetro mappedName="...." de ambas anotaciones) a
@Stateless(mappedName="gestor_clientes") ... @Stateful(mappedName="carrito_compra") ...
Nota: si no se indica nada el contendor EJB asignar uno a Opcionalmente se puede explicitar el nombre y el tipo de acceso de los interfaces de negocio soportados
@Stateless @Local(GestorClientes.class) ... @Stateful @Remote(CarritoCompra.class) ...
Se pueden marcar mtodos con anotaciones especiales para ine dicar que sean invocados por el contenedor EJBs en momentos concretos del ciclo de vida del bean
@PostConstruct: una vez que el contenedor instancia el EJB y le inyecta dependencias (antes de recibir su primera invocacin) o @PreDestroy: justo antes de eliminar denitivamente el EJB @PrePassitivate: (slo stateful) justo antes almacenar el estado en disco temporalmente o @PostPassitivate (slo stateful) justo de recuperar el estado almacenado en disco o temporalmente
Mtodo anotado con @Remove puede ser invocado por clientes e para eliminar una instancia del EJB del contenedor (3) Empaquetado y despliegue Empaquetado de EJBs: Creacin de chero JAR conteniendo: 8 o
o < clases de implemementacin de EJBs interfaces de negocio Bytecode (cheros .class) de : otras clases auxiliares necesarias
Ficheros .class estructurados en paquetes (subdirectorios) segn corresponda u
Directorio META-INF conteniendo los cheros de conguracin exigidos por o el contenedor o que pudieran ser necesarios descriptor de despliegue [ejb-jar.xml] descriptor de persistencia [persistence.xml] MANIFEST.MF otros ... Librer adicionales (cheros JAR) as
Despliegue de EJBs: El chero JAR resultante se puede desplegar directamente en el contenedor JEE o incluirlo como un mdudo EJB de una Aplicacin JEE (paquetes EAR) o o
Al ser deplegado un EJB en un contenedor se le asocia un nombre segn lo u indicado en sus anotaciones o en su descriptor de despliegue Ese nombre se registra en el servidor de nombres del contendor EJB, accesible por JNDI. Una vez desplegado los clientes pueden acceder al EJB usando ese nombre e invocar sus mtodos e
(c) Acceso e invocacin de EJBs de sesin o o Para utilizar mtodos de un EJB desplegado es necesario que el e cliente cuente con una referencia al mismo (stub), que ser la que a gestione las invocaciones sobre RMI/IIOP Opcin 1: Inyeccin de dependencias por parte del contenedor JEE o o Uso de la anotacin @EJB acompaando al atributo donde se o n mantendr la referencia al EJB a
El tipo del atributo/referencia ser el nombre del interfaz de negocio que a se desea invocar El contenedor usar el nombre por defecto del EJB (o el que se especique a en el parmetro @EBJ(mappedName="...")) para consultar al servidor de a nombres JNDI, inyectando en ese atributo la referencia encontrada
Inyeccin de referencias con @EJB slo es posible dentro de un o o entorno de ejecucin JEE o
Contenedor de servlets: es posible inyectar EJBs para invocarlos desde servlets y pginas JSP a Contenedor de EJBs: es posible inyectar EJBs para invocarlos desde otros EJBs Contenedor de clientes JEE: clientes Java stand-alone ejecutndose en el a contexto de un contenedor de clientes JEE pueden obtener e invocar EJBs
Es necesario disponer de las API de JEE 5 para inyectar estas dependencias Ejemplo: appclient en GlassFish/Sun Application Server Importante: Los contenedores de clientes JEE slo pueden inyectar EJBs sobre o atributos de tipo static de la clase principal donde se incluya el mtodo main() e
Ejemplo:
public class ClaseLlamadora { @EJB(mappedName="carrito_compra") private CarritoCompra carrito; // mappedName es opcional
Opcin 2: Consulta JDNI empleando el nombre asignado al EJB o Siempre es posible consultar el servicio JNDI presente en todos los servidores aplicaciones JEE
Se usa el API de JNDI paquete javax.naming.* Interfaz InitialContext, mtodos lookup(...) e
Se obtiene una referencia a un EJB a partir del nombre asignado (en la anotacin, en el descriptor de despliegue o del nombre por o defecto asignado por el contenedor)
Este era el modo en que se hac en las versiones de EJB 2.x y anteriores a El nombre por defecto con el que se registran los EJBs no est estandarizado a y cada servidor de aplicaciones organiza el directorio de nombres de forma distinta
GlassFish usa el nombre de la clase completamente cualicado (lista de paquetes)
Ejemplo:
import javax.naming.InitialContext; public class EjemploCliente { public static void main(String args[]) { ... InitialContext ic = new InitialContext(); CarritoCompra carrito = (CarritoCompra) ic.lookup("carrito_compra"); carrito.inicializar(...); carrito.anadir(...); ... }
JPA (Java Persistence API ) especica un marco para denir e implementar mapeos Objeto-Relacional Mapeo Objeto-Relacional (Object/Relational Mapping - ORM): permite manejar datos en BD relacionales mediante objetos
Simplica el desarrollo de aplicaciones basadas en BD relacionales (todo son objetos) Ofrece persistencia de obetos de forma transparente Automatiza y unica las tareas de mantenimiento de datos relacionales Evita que el cdigo sea dependiente de caracter o sitcas espec cas de un gestor de BD concreto
JPA unica la forma en que funcionan las distintas soluciones que proveen el mapeo ORM
JPA dene la forma en que se describe ese mapeo ORM JPA dene el interfaz con el proveedor de persistencia que ser quien realmente a realice la transformacin e interacte con el gestor de la BD o u
Reemplaza los EntityBeans: mapeo O/R de EJB 2.x JPA no es exclusivo de Java EE, puede usarse an aplicaciones Java independientes
(a) Especiciacin de Entidades JPA o Cada tabla de la BD estar representada en Java por una Entidad a Una entidad es una clase Java marcada con la anotacin @Entity o
Cada instancia de esa clase Entidad mapear una tupla de esa tabla a 1 constructor vac o Entidades deben ser JavaBeans accesos con get() y set() Todos los atributos de la Entidad, salvo los marcados @Transient, son persistentes y se correspondern con columnas de la tabla mapeada a Cada instancia de una Entidad es unica y debe estar identicada por uno o ms de sus atributos a Atributos persistentes permitidos:
No se permiten atributos estticos o de tipo nal a Tipos primitivos: int, oat, etc Objetos para tipos primitivos: java.lang.Integer, java.lang.Float, etc java.lang.String, java.math.BigInteger, java.math.BigDecimal java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Timestamp Otras entidades (relaciones entre entidades) Clases embebibles: marcadas con @Embebedable Coleccin y conjuntos de entidades: java.util.Collections, java.util.Sets o
Anotacin @Table: especica la tabla relacionada con la entidad (si o no coinciden sus nombres)
name: nombre de la tabla (por defecto coincide con el de la entidad) catalog: nombre del catlogo a schema: nombre del esquema uniqueConstraints: restricciones de unicidad
a la declaracin del atributo en la Entidad o al mtodo get() de ese atributo e @Column: especica una columna de la tabla a mapear sobre un atributo de la entidad
Es opcional: si no se especica lo contrario se asume que todos los atributos de la entidad mapean una columna de la BD con su mismo nombre y tipo name (nombre de la columna) unique (atributo con valor unico) nullable (permite nulos) insertable, updatable length, precision, scale, ...
10
@SequenceGenerator (opc.) especica el generador de claves primarias @TableGenerator (opc.) especica una tabla de claves primarias @EmbeddedId: indica una clave primaria con mltiples campos, almacenados u en una clase Embebida (marcada con anotacin @Embebedable) o @IdClass: especica una clave primaria compuesta, mapeada a varios atributos de la entidad. @Temporal: especica el mapeo de campos de BD que almacenan fechas @Lob: especica el mapeo de campos de BD que almacenan datos binarios (BLOG) @Basic: permite especicar detalles adicionales del mapeo de tipos bsicos a @JoinColumn: especica un atributo que acta como clave fornea de otra u a entidad
name nombre de la columna que acta como clave fornea en la tabla u a referenced nombre de la columna referencia en la tabla relacionada (opc) table nombre de la tabla relacionada que contiene la columna (opc) unique, nullable, insertable, updatable, ... (opc)
Especicacin de relaciones entre Entidades (interpretadas desde o el punto de vista de la Entidad denida) Parmetros comunes: a
cascade: indica las operaciones (ALL, PERSIST, MERGE, REMOVE, REFRESH) que se aplicarn en cascada sobre las Entidades relacionadas a fetch: forma en que se cargan los datos
FetchType.LAZY carga las entidades relacionas cuando se accede al atributo (carga perezosa) FetchType.EAGER carga completa de todas las entidades relacionadas
optional relacin opcional o mappedBy campo de la Entidad relacionada que posee la relacin (nicamente o u se especica en uno de los lados de la relacin [el que no tiene clave fornea]) o a
11
Tipos de relaciones:
@OneToOne (relacin 1:1) indica un atributo que est asociado con una tupla o a de otra Entidad
Puede requerir una anotacin @JoinColumn (marca el atributo como clave fornea) o a Puede requerir especicar el parmetro mappedBy a
@OneToMany (relacin 1:N) indica un atributo que est asociado con varias o a tuplas de otra Entidad (lado N)
Aplicada sobre atributos de tipo SetEntidad o CollectionEntidad Requiere especicar el parmetro mappedBy (clave fornea en el extremo N) a a
@ManyToOne (relacin N:1) indica un atributo (lado N) asociado con una tupla o de otra Entidad (lado 1)
Requiere una anotacin @JoinColumn para marcar el atributo como clave fornea o a
@ManyToMany (relacin N:M) indica un atributo que tiene una relacin N:M o o con tuplas de otra Entidad
Aplicada sobre atributos de tipo SetEntidad o CollectionEntidad Requiere especicar la tabla que implementa la relacin con sus claves forneas con la o a anotacin @JoinTable o
@JoinTable mapeo de una relacin ManyToMany o una OneToMany que o haga uso de una tabla
name: nombre de la tabla join que soporta la relacin o catalog, schema joinColumns: columnas con las claves forneas de la primera tabla de la relacin a o inverseJoinColumns: columnas con las claves forneas de la segunda tabla de la relacin a o uniqueConstraints
@MapKey especica el mapeo sobre colecciones de tipo java.util.Map (tablas Hash) @OrderBy especica el orden de las colecciones mapeadas
12
13
(b) Interfaz EntityManager (EM) EntityManager (EM) ofrece los mtodos con los que se interacta con e u el entorno de persistencia
Control de transacciones Gestin del ciclo de vida de las Entidades o Creacin de consultas (Query ) o Otros: gestin de cachs, gestin identidad de las Entidades o e o
Cada EntityManager estar asociado a una Persistence Unit a Denen los contextos de persistencia de la aplicacin o Especican el proveedor de persistencia a emplear (toplink, hibernate, JDO, etc) y el DataSource con informacin de la BD a utilizar o Descritos en el chero persistence.xml
Ubicado en directorios
<persistence> <persistence-unit name="EjemploPedidosPU" transaction-type="JTA"> <jta-data-source>jdbc/EjemploPedidos</jta-data-source> <properties> <property name="toplink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
META-INF/ en paquetes JAR de mdulos EJBs o WEB-INF/classes/META-INF en paquetes WAR de mdulos Web o
Elementos
persistence-unit name: nombre del contexto de persistencia jta-data-source, non-jta-data-source: nombre JNDI del DataSource El DataSource de la correspondiente BD deber haber sido denido previamente a <resources> <jdbc-resource enabled="true" jndi-name="jdbc/EjemploPedidos" object-type="user" pool-name="mysqlPool"/> <jdbc-connection-pool ... name="mysqlPool" ... ... res-type="javax.sql.DataSource" ... > <property name="serverName" value="localhost"/> <property name="portNumber" value="3306"/> <property name="databaseName" value="scs_pedidos"/> <property name="User" value="scs"/> <property name="Password" value="scs"/> <property name="URL" value="jdbc:mysql://localhost:3306/scs_pedidos"/> <property name="driverClass" value="com.mysql.jdbc.Driver"/> </jdbc-connection-pool> </resources> properties: conguracin espec o ca del proveedor de persistencia JPA
14
Se debe indicar el nombre de la PersistenceUnit a utilizar si hay ms a de una denida Mediante la factor EntityManagerFactory indicando el nombre del a contexto de persistencia congurado en persistence.xml
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EjemploPedidosPU"); EntityManager em = emf.createEntityManager();
Mtodos del interfaz EM e Todas las operaciones del EM deben realizarse dentro de una transaccin o
En EJBs o componentes Web (servlets, JSPs) las transacciones son gestionadas por el Servidor de Aplicaciones Desde el propio EM se puede acceder al gestor de trasacciones para iniciar y nalizar transacciones (getTransaction().begin() y getTransaction().commit()) Mtodo empleado en aplicaciones de escritorio JSE e
Ciclo de vida de las Entidades Las modicaciones sobre instancias gestionadas por el EM realizadas dentro de una transaccin se reejarn automticamente en la BD o a a
Instancias gestionadas por el EM pertenecen a su contexto de persistencia Escritura efectiva en BD cuando se complete satisfactoriamente la transaccin o
15
Gestin del ciclo de vida de las Entidades (mtodos del EM) o e T find(Class<T>e, Object id) : busca una instancia de una Entidad usando su clave primaria
Devuelve una instancia con todos sus atributos rellenados (excepto los que soporten relaciones marcadas con FetchType.LAZY )
16
T merge(T e) : actualiza las modicaciones sobre instancia de una entidad, devolviendo una nueva instancia de esa entidad (instancia gestionada por el EM)
Permite incorporar modicaciones realizadas sobre instancias que salieron del contexto de persistencia del EM T picamente sern modicaciones realizadas sobre copias serializadas pasadas a en invocaciones remotas a otros contextos
SERVIDOR Articulo buscar(int id) { ... Articulo a = em.find(Articulo.class, id); return(a); } void modificar(Articulo a) { ... em.merge(a); ... } CLIENTE ... Articulo a = servidor.buscar(105); a.setPrecio(150); a.setDescripcion(a.getDescription() + "(en oferta)"); servidor.modificar(a); ...
17
(c) Lenguaje de Consulta JPQL JPQL: Java Persistence Query Language Ofrece una sintaxis similar a la de SQL para realizar consultas sobre entidades JPA Clausula FROM maneja nombres de Entidades (no tablas)
Hace uso de las relaciones mapeadas 1:N o N:M para denir los JOINs entre tablas relacionadas Sintaxis: IN JOIN o No necesario con relaciones 1:1 o N:1
Se permiten consultas de tipo SELECT, UPDATE y DELETE Consultas (objetos de tipo Query ) son creadas por el EM Query createQuery(String q) : crea una consulta JPQL Query createNamedQuery(String q) : crea una consulta nombrada, vinculada a una Entidad y denida con la anotacin @NamedQuery o Query createNativeQuery(String q) : crea una consulta SQL Ejecucin de consultas o Object getSingleResult() : devuelve un objeto con el resultado unico de la consulta
Devuelve un array (Object[]) cuando SELECT especica varios valores
List getResultList() : devuelve una coleccin List con los resultao dos de la consulta
Se puede especicar el rango de valores a devolver (til para paginar resultados) u Query setFirstResult(int): inicio del rango Query setMaxResults(int): tamao del rango n
18
Consultas parametrizadas :nombre (paramtros con nombre) e Notacin: o ?3 (parmetros posicionales) a Mtodos de la clase Query e
Query setParameter(String s, Object o) : asocia valor a un parmetro a nombrado Query setParameter(int pos, Object o) : asocia valor a un parmetro poa sicional
19