La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Persistencia: Entity Beans

Presentaciones similares


Presentación del tema: "Persistencia: Entity Beans"— Transcripción de la presentación:

1 Persistencia: Entity Beans
JEE-EJB3 Persistencia: Entity Beans

2 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 2010 Ing. de Sistemas II

3 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 2010 Ing. de Sistemas II

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

5 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 2010 Ing. de Sistemas II

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

7 Mapeo de Entity Beans @Entity @Table(name=“MAESTRO_ARTICULOS”)
public class Articulo implements Serializable{ private long codigo; private String descripcion; private String color; @Id(generate=GeneratorType.AUTO) @Column(name=“ID”) public long getCodigo() { return codigo; } public void setCodigo(long codigo) { this.codigo = codigo; Declaración de Bean Declaración de PK 2010 Ing. de Sistemas II

8 Mapeo de Entity Beans @Entity @Table(name=“MAESTRO_ARTICULOS”)
public class Articulo implements Serializable{ private long codigo; private String descripcion; private String color; @Id(generate=GeneratorType.AUTO) @Column(name=“ID”) 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), ); 2010 Ing. de Sistemas II

9 Mapeo de Entity Beans @Entity @Table(name=“MAESTRO_ARTICULOS”)
public class Articulo implements Serializable{ private long codigo; private String descripcion; private String color; @Id(generate=GeneratorType.AUTO) @Column(name=“ID”) 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), ); 2010 Ing. de Sistemas II

10 Mapeo de Entity Beans … @Column(name=“DESC”, 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 2010 Ing. de Sistemas II

11 Mapeo de Entity Beans … @Column(name=“DESC”, 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), ); 2010 Ing. de Sistemas II

12 Un Entity se puede guardar en una o más tablas
Mapeos Multi-Tabla Mapeos Multi-Tabla: Un Entity se puede guardar en una o más tablas @SecondaryTable 2010 Ing. de Sistemas II

13 Mapeos Multi-Tabla @Entity @SecondaryTables({
@SecondaryTable(name=“ADDRESS” public class Customer { private long id; private String name; private String street; private String city; private String state; @Id(generate=GeneratorType.AUTO) 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 2010 Ing. de Sistemas II

14 Mapeos Multi-Tabla @Column(name=“STREET”, secondaryTable=“ADDRESS”)
public String getStreet() { return street; } public void setStreet(String street) { this.street = street; @Column(name=“CITY”, 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) 2009 Ing. de Sistemas II

15 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 otras @Embeddable 2010 Ing. de Sistemas II

16 Mapeos de PKs Compuestas
@Entity public class Customer { private CustomerPK id; @EmbeddedId public CustomerPK getId() { return id; } public void setId(CustomerPK id) { this.id = id; @Embeddable public class CustomerPK { private String name; private long ssn; @Column(“NAME”) public String getName() { return name; } public long getSSN() { return ssn; 2010 Ing. de Sistemas II

17 Ciclo de Vida de un Entity: Callbacks
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 2010 Ing. de Sistemas II

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

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

20 Interactuando con Entity Beans
Entity Manager

21 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 2009 Ing. de Sistemas II

22 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> 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> 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 ... } 2009 Ing. de Sistemas II

23 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< Material > materiales = new HashSet(); materiales.add(material ); art.set Materiales(materiales); 2010 Ing. de Sistemas II

24 Interacción con Instancias
Interacción a través de un Session Bean @Stateless public class AdministradorArticulosBean implements AdministradorArticulos{ @PersistenceContext 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 2010 Ing. de Sistemas II

25 Interacción con Instancias
@Stateless public class AdministradorArticulosBean implements AdministradorArticulos{ @PersistenceContext 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 2010 Ing. de Sistemas II

26 Interacción con Instancias
@Stateless public class AdministradorArticulosBean implements AdministradorArticulos{ @PersistenceContext 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 2010 Ing. de Sistemas II

27 Interacción con Instancias
@Stateless public class AdministradorArticulosBean implements AdministradorArticulos{ @PersistenceContext 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 2010 Ing. de Sistemas II

28 Uso del Patron Session Façade

29 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 2010 Ing. de Sistemas II

30 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 2010 Ing. de Sistemas II

31 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 Session Entity 1 Entity 2 Cliente TX ejecutarAlgo() actualizarEntity1() actualizarEntity2() Acceso Remoto 2010 Ing. de Sistemas II

32 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 Session Facade Session Entity 1 Entity 2 operacion1() TX ejecutarAlgo() actualizarEntity1() Acceso Remoto actualizarEntity2() 2010 Ing. de Sistemas II


Descargar ppt "Persistencia: Entity Beans"

Presentaciones similares


Anuncios Google