La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

JEE-EJB3 Persistencia: Entity Beans. 2010Ing. de Sistemas II2 Objetivos Objetivos de la API de Persistencia en JEE: –Solucionar el mapeo Objeto/Relacional.

Presentaciones similares


Presentación del tema: "JEE-EJB3 Persistencia: Entity Beans. 2010Ing. de Sistemas II2 Objetivos Objetivos de la API de Persistencia en JEE: –Solucionar el mapeo Objeto/Relacional."— Transcripción de la presentación:

1 JEE-EJB3 Persistencia: Entity Beans

2 2010Ing. de Sistemas II2 Objetivos Objetivos de la API de Persistencia en JEE: –Solucionar el mapeo Objeto/Relacional (O/R) a nivel de especificación Evitar que el programador lo solucione a mano, embebiendo código SQL y perdiendo la representación como objeto –Manejar el ciclo de vida de los objetos Creación, Modificación, Persistencia –Ofrecer un potente idioma de consultas Lo más parecido en sintaxis y funcionalidad a SQL JOIN, GROUP-BY, HAVING Permitir el uso de consultas SQL nativas cuando no sea suficiente con el estándar –Polimorfismo Soportar la herencia de objetos en las relaciones y en las consultas

3 2010Ing. de Sistemas II3 Entity Beans Representan datos persistentes –Cualquier entidad del modelo de dominio –Se guardan en una BD, con un identificador –El estado queda en la BD, por lo que sobreviven una caída del contenedor Se implementan con una clase Java común –Se debe agregar metadata de cómo persistir el estado interno del objeto en un modelo relacional (mapping) No están asociados a un usuario en particular (como los Session Beans) –Se comparten entre varios usuarios –Existen independientemente de cualquier usuario Soportan un lenguaje de consultas –Para buscar una o varias instancias en particular

4 2010Ing. de Sistemas II4 Entity Beans Articulo Codigo=100 Descripcion=AAA Color=Rojo ARTICULO ID DESCCOLOR AAA BBB R M Entity Bean Mapping Tabla

5 2010Ing. de Sistemas II5 Anotaciones en Java y Entity Beans JDK 1.5 agrega una nueva construcción al lenguaje: Annotations –Formaliza la posibilidad de embeber en el código metadata importante para su ejecución –Antes esta metadata sólo se podía incluir en archivos externos (XML Descriptors) lo que generaba una desconexión importante entre el código y el Descriptor EJB 3.x permite usar sólo anotaciones en vez de DD –Los XML Deployment Descriptors son declarativos, se pueden cambiar sin recompilar el código –Las Anotaciones son compiladas, los cambios fuerzan una recompilación –Se pueden usar ámbas opciones, cuando la misma información se encuentre en las 2 declaraciones, el DD se toma en cuenta por sobre la anotación

6 2010Ing. de Sistemas II6 Entity Beans – Mapeo O/R Metadata de Mapeo O/R con anotaciones: –Mapeo –Mapeo –Mapeo –Mapeo –Mapeo de Objetos –Mapeo

7 2010Ing. de Sistemas II7 Mapeo de public class Articulo implements Serializable{ private long codigo; private String descripcion; private public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = public class Articulo implements Serializable{ private long codigo; private String descripcion; private public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = codigo; } Declaración de Bean Declaración de PK

8 2010Ing. de Sistemas II8 Mapeo de public class Articulo implements Serializable{ private long codigo; private String descripcion; private public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = public class Articulo implements Serializable{ private long codigo; private String descripcion; private public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = codigo; } create table MAESTRO_ARTICULOS ( ID Number, DESC varchar(255), color varchar(255), ); create table MAESTRO_ARTICULOS ( ID Number, DESC varchar(255), color varchar(255), );

9 2010Ing. de Sistemas II9 Mapeo de public class Articulo implements Serializable{ private long codigo; private String descripcion; private public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = public class Articulo implements Serializable{ private long codigo; private String descripcion; private public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = codigo; } create table MAESTRO_ARTICULOS ( ID Number, DESC varchar(500), color varchar(255), ); create table MAESTRO_ARTICULOS ( ID Number, DESC varchar(500), color varchar(255), );

10 2010Ing. de Sistemas II10 Mapeo de Entity Beans length=500) public String getDescripcion() { return descripcion; } public void setDescripcion(String desc) { this.descripcion = desc; } public String getColor() { return color; } protected void setColor(String color) { this.color = color; } length=500) public String getDescripcion() { return descripcion; } public void setDescripcion(String desc) { this.descripcion = desc; } public String getColor() { return color; } protected void setColor(String color) { this.color = color; } Mapeo de columna Mapeo por Default

11 2010Ing. de Sistemas II11 Mapeo de Entity Beans length=500) public String getDescripcion() { return descripcion; } public void setDescripcion(String desc) { this.descripcion = desc; } public String getColor() { return color; } protected void setColor(String color) { this.color = color; } length=500) public String getDescripcion() { return descripcion; } public void setDescripcion(String desc) { this.descripcion = desc; } public String getColor() { return color; } protected void setColor(String color) { this.color = color; } create table AUCTION_ITEM ( ID Number, DESC varchar(500), color varchar(255), ); create table AUCTION_ITEM ( ID Number, DESC varchar(500), color varchar(255), );

12 2010Ing. de Sistemas II12 Mapeos Multi-Tabla Mapeos Multi-Tabla: –Un Entity se puede guardar en una o más

13 2010Ing. de Sistemas II13 @SecondaryTable(name=ADDRESS public class Customer { private long id; private String name; private String street; private String city; private String public long getId() { return id; } public void setId(long id) { this.id = @SecondaryTable(name=ADDRESS public class Customer { private long id; private String name; private String street; private String city; private String public long getId() { return id; } public void setId(long id) { this.id = id; } create table Customer ( ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) );z create table Customer ( ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) );z

14 2009Ing. de Sistemas II14 Mapeos secondaryTable=ADDRESS) public String getStreet() { return street; } public void setStreet(String street) { this.street = street; secondaryTable=ADDRESS) public String getCity() { return city; } protected void setCity(String city) { this.city = city; secondaryTable=ADDRESS) public String getStreet() { return street; } public void setStreet(String street) { this.street = street; secondaryTable=ADDRESS) public String getCity() { return city; } protected void setCity(String city) { this.city = city; } create table Customer ( OWNER_ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) ); create table Customer ( OWNER_ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) );

15 2010Ing. de Sistemas II15 Mapeos de PKs Compuestas Mapeos de PKs Compuestas: –Un Entity puede tener un identificador que comprenda más de una columna –Las PKs compuestas son otras Entidades que no se persisten en forma separada, se embeben en

16 2010Ing. de Sistemas II16 Mapeos de PKs public class Customer { private CustomerPK public CustomerPK getId() { return id; } public void setId(CustomerPK id) { this.id = id; public class Customer { private CustomerPK public CustomerPK getId() { return id; } public void setId(CustomerPK id) { this.id = id; public class CustomerPK { private String name; private long public String getName() { return name; } public long getSSN() { return ssn; } public class CustomerPK { private String name; private long public String getName() { return name; } public long getSSN() { return ssn; } …

17 2010Ing. de Sistemas II17 Ciclo de Vida de un Entity: Callbacks Ciclo de Vida de un Entity: –Un Entity durante su vida atraviesa diferentes estados que se traducen en diferentes operaciones en la BD Creación INSERT Actualización UPDATE Selección SELECT Destrucción DELETE Como programador, no puedo intervenir en la forma o en el momento en que se ejecutan esas operaciones en la BD (responsabilidad del contenedor) pero sí puedo ejecutar código propio antes o después de la ejecución de esas operaciones –Para ejecutar controles sobre estas operaciones –Para enviar notificaciones o alertas Para ejecutar código según el ciclo de vida del Entity, se usan los métodos callback –Metodos que se anotan con la(s) fase(s) de ciclo de vida que interesan –El código dentro de ese metodo se ejecutará cuando se atraviese esa fase

18 2010Ing. de Sistemas II18 Ciclo de Vida de un Entity: –Ejecutados antes y despues de la inserción en la –Ejecutados antes y despues de la actualización en la –Despues que el entity fué seleccionado y cargado de la BD al contenedor –Antes de retornar el resultado de una consulta que seleccionó ese –Ejecutados antes y despues de la eliminación en la BD

19 2010Ing. de Sistemas II19 Ciclo de Vida de un Entity: Métodos Callbacks public class Articulo implements Serializable public void validarCampos() throws Exception{ public void cambiarMayusculas() { } public class Articulo implements Serializable public void validarCampos() throws Exception{ public void cambiarMayusculas() { } –Se implementan en la clase del Entity –Puedo implementar uno, varios o ninguno

20 Interactuando con Entity Beans Entity Manager

21 2009Ing. de Sistemas II21 Entity Manager Los entity beans se crean como cualquier clase Java: –Articulo art = new Articulo(); Pueden ser detachados y reatachados al contenedor –Se pueden serializar hasta un cliente remoto –El cliente modifica esa copia local –La copia se reenvia al contenedor y este actualiza el estado en la BD Todo la interacción es a través del servicio de EntityManager (EM): –Creación, Actualización, Selección y Eliminación de instancias El EM se inyecta (con una anotación especial) en cualquier objeto que vaya a controlar Entity Beans –Generalmente es un Session Bean que actua de Controlador

22 2009Ing. de Sistemas II22 EntityManager API del EntityManager: –Creación, Actualización y Eliminación de instancias –Selección de instancias según la PK –Selección de instancias según consultas public interface EntityManager { public void persist(Object entity); // inserción public T merge(T entity); // actualización public void remove(Object entity); // eliminación public Object find(String entityName, Object primaryKey); // selección por PK public T find(Class entityClass, Object primaryKey); // --´´-- public void flush(); // sincronizar con BD public Query createQuery(String ejbqlString); // crear una consulta de selección public Query createNamedQuery(String name); // crear una consulta de selección por nombre public Query createNativeQuery(String sqlString); // crear una consulta de selección nativa public void refresh(Object entity); // sincronizar desde la BD... } public interface EntityManager { public void persist(Object entity); // inserción public T merge(T entity); // actualización public void remove(Object entity); // eliminación public Object find(String entityName, Object primaryKey); // selección por PK public T find(Class entityClass, Object primaryKey); // --´´-- public void flush(); // sincronizar con BD public Query createQuery(String ejbqlString); // crear una consulta de selección public Query createNamedQuery(String name); // crear una consulta de selección por nombre public Query createNativeQuery(String sqlString); // crear una consulta de selección nativa public void refresh(Object entity); // sincronizar desde la BD... }

23 2010Ing. de Sistemas II23 Interacción con Instancias Crear las instancias como cualquier objeto Java Se puede crear un grafo complejo de ser necesario Articulo art = new Articulo (); item.setDescripcion(AAA); item.setColor(Rojo); … Material material = new Material (); material.setDescripcion(Boton Metal); material.setCantidad(3); … HashSet materiales = new HashSet(); materiales.add(material ); art.set Materiales(materiales); Articulo art = new Articulo (); item.setDescripcion(AAA); item.setColor(Rojo); … Material material = new Material (); material.setDescripcion(Boton Metal); material.setCantidad(3); … HashSet materiales = new HashSet(); materiales.add(material ); art.set Materiales(materiales);

24 2010Ing. de Sistemas II24 Interacción a través de un Session Bean Interacción con public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); } Inyectar el servicio de EntityManager

25 2010Ing. de Sistemas II25 Interacción con public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); } El artículo fué creado en el cliente El objeto y todo el grafo (segú configuración) se insertan en la BD

26 2010Ing. de Sistemas II26 Interacción con public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); } Artículo seleccionado según la PK Detachado del contenedor Se puede serializar y enviar al cliente para manipulación

27 2010Ing. de Sistemas II27 Interacción con public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); public class AdministradorArticulosBean implements private EntityManager em; public long nuevoArticulo(Articulo art) { em.create(art); return art.getCodigo(); } public Articulo buscarPorCodigo(long codigo) { return em.find(Articulo.class, codigo); } public void actualizarArticulo(Articulo art) { em.merge(art); } El Artículo pudo ser modificado remotamente en el cliente Merge() actualiza el estado en la BD y lo vuelve a atachar al contenedor

28 Uso del Patron Session Façade

29 2010Ing. de Sistemas II29 Patrón Session Façade Incluir un Session Bean (Fachada) al frente de los Entity Beans: –Para reducir el número de llamadas remotas e incrementar la performance La Fachada usa la interfaz Local del Entity –Para un mejor control transaccional e incrementar la escalabilidad La frontera de la TX está en el servidor y no en el cliente Al centralizar las invocaciones en la VM del servidor, todas las comunicaciones entre Beans son Locales, lo que reduce el tiempo total de la TX Menor tiempo de TX, mayor cantidad de usuarios concurrentes

30 2010Ing. de Sistemas II30 Patrón Session Façade Incluir un Session Bean (Fachada) al frente de los Entity Beans: –Para forzar una sola secuencia de interacción entre componentes Aisla al cliente de tener que entender cuantos existen y cómo interactuan los Session/Entity Beans No permite que el cliente ejecute secuencias de ejecución inválidas –Para aislar al cliente de las APIs de los componentes internos El cliente sólo conoce la API de la Fachada, nunca accede a los otros Session o Entity directamente Todo lo que esté detrás de la Fachada puede cambiar sin romper el contrato con el cliente

31 2010Ing. de Sistemas II31 Sin Patrón Session Façade Varias comunicaciones remotas aún cuando todos los Beans están en el mismo servidor La TX tarda más, ya que la abre/cierra el cliente por la red El cliente está expuesto a las APIs de todos los Beans El cliente tiene que conocer el orden exacto de ejecución de las llamadas Cliente Acceso Remoto SessionEntity 1Entity 2 ejecutarAlgo() actualizarEntity1() TX actualizarEntity2()

32 2010Ing. de Sistemas II32 Con Patrón Session Façade La cantidad de llamadas por la red es la mínima La frontera de la TX se mantiene en el server El cliente solo conoce la API de la Fachada El cliente no conoce el orden de ejecución de las llamadas Los Beans y el orden de ejecución pueden cambiar sin romper el cliente Client Acceso Remoto SessionEntity 1Entity 2 ejecutarAlgo() actualizarEntity1() actualizarEntity2() TX operacion1() Session Facade


Descargar ppt "JEE-EJB3 Persistencia: Entity Beans. 2010Ing. de Sistemas II2 Objetivos Objetivos de la API de Persistencia en JEE: –Solucionar el mapeo Objeto/Relacional."

Presentaciones similares


Anuncios Google