Sunteți pe pagina 1din 34

Tema 2 Seminarios EJB 3.

Session Beans

EJBs
Son componentes servidor que:
Implementan la lgica de negocio de la aplicacin Facilitan el desarrollo de aplicaciones distribuidas, transaccionales, seguras, escalables, ...

Existen tres tipos de EJBs


Session Beans Message Driven Beans Entity Beans

Tema 2 JPA - 3

Session Beans
Representan las acciones, el cmo. Un SB proporciona servicios como clculos, reglas de negocio, acceso a BD, etc. para un cliente. Los hay de dos tipos:
Stateless Stateful

Tema 2 JPA - 4

Tipos
Stateless
Operaciones simples, autocontenidas. No requieren mantener el estado conversacional. Instancias equivalentes y compartibles. Pool de instancias.

Stateful
Operaciones que se expanden en mltiples peticiones. Requieren mantener el estado conversacional. Cada bean sirve a un nico usuario y no puede ser compartido.

Tema 2 JPA - 5

Message-driven Beans
Tambin representan acciones. Permite a los clientes acceder a servicios de negocio asncronos. Un MDB est permanentemente escuchando la llegada de un mensaje dirigido a l. Cuando llega un mensaje, se ejecuta la lgica de negocio asociada al MDB.

Tema 2 JPA - 6

Entity Beans
Representan las cosas, el qu. Un EB es un objeto persistente que representa datos mantenidos en un almacn de datos.

Tema 2 JPA - 7

Session Beans en EJB 3.0


public interface HolaService { String saludar(); } @Local public interface HolaServiceLocal extends HolaService {} @Remote public interface HolaServiceRemote extends HolaService {} @Stateless public class HolaServiceBean implements HolaServiceLocal, HolaServiceRemote { public String saludar() { return Hola a todos!; } }

Tema 2 JPA - 8

Session Beans en EJB 3.0


@Local public interface CarroLocal { public void addItem(String id, int cantidad); public void eliminarItem(String id, int cantidad); public Map<String, Integer> getItems(); public void checkout(int idPago); public void cancel(); } @Stateful public class CarroCompraBean implements CarroLocal { // ... @Remove public void cancel() {...} // ... }

Tema 2 JPA - 9

Inyeccin de dependencias
Nuevo mecanismo de EJB 3.0 que facilita el uso de EJB's en los clientes. Ejemplo servlet:
public class MiServlet extends HttpServlet { @EJB(name=HolaServiceLocal) public HolaServiceLocal servicio; public void doGet(...) { ... String saludo = servicio.saludar(); ... } }
Es inicializado automticamente por el contenedor

Tema 2 JPA - 10

JPA (Java Persistence API)

Impedance mismatch
Algunos objetos de nuestra aplicacin necesitan persistencia. Normalmente utilizamos bases de datos relacionales Alguien se tiene que para ello.
Asignatura
-codigo:int -nombre:String -creditos:int
1..*

Curso
-numero:int

encargar de la traduccin entre modelos en uno y otro sentido (O-R Mapping)

AsignaturaTroncal

AsignaturaOptativa

1..*

Itinerario
-descripcion:String

Modelo OO
Tema 2 JPA - 12

ORM Modelo relacional

Entity Beans en EJB 2.x


Accedemos a ellos a travs de un HomeObject en el que definimos servicios especiales de creacin, bsqueda, etc. Son objetos potencialmente remotos:
Cliente getAtributo1() getAtributo2() getAtributo3() getAtributo4() getAtributo5() EB
Cliente DTO (cli.) getDTO() EB DTO (serv.) <<create>> setAtributo1() ... setAtributoN()

Solucin tradicional: Patrn Data Transfer Object ( Value Object)

Red
DTO getAtributo1() ... getAtributoN()

Red Antipatrn DTO

Tema 2 JPA - 13

Entity Beans en EJB 3.0


Entity Beans en EJB 3.0 son POJO (Plain Old Java Objects) Trabajamos con ellos como lo hacemos con objetos normales:
Los creamos con el operador new() Accedemos a sus mtodos normalmente Para la persistencia, utilizamos el servicio central: javax.persistence.EntityManager, que controla la persistencia de las entidades

Pueden transferirse por la red normalmente a un cliente, modificarse en ste, reenviarse al servidor y resincronizarse con la BD (desaparece la necesidad de DTO)
Tema 2 JPA - 14

Entity Beans en EJB 3.0


La plataforma gestiona automticamente:
el O-R Mapping tanto de propiedades como de relaciones de los objetos y la herencia la sincronizacin con la BD

Utilizamos anotaciones (Java SE 5) para proporcionar informacin sobre el mapping


Lgicas: describen la entidad desde el punto de vista del modelo de dominio Fsicas: definen el modelo fsico en la BD

Potente lenguaje de consulta basado en el modelo de dominio: EJB QL


Tema 2 JPA - 15

Un ejemplo
@Entity public class Asignatura { private Long codigo; private String nombre; private int creditos; private Curso curso; @Id public Long getCodigo() { return codigo; } public void setCodigo(Long codigo) { this.codigo = codigo; } ...

Variables persistentes @Id indica que se trata de la clave primaria

La entidad debe tener un constructor sin argumentos

Tema 2 JPA - 16

Un ejemplo (cont.)
// getters y setters para las propiedades nombre y creditos @ManyToOne public Curso getCurso() { return curso; } public void setCurso(Curso curso) { this.curso = curso; } }

Tema 2 JPA - 17

Contexto de persistencia
Una instancia de una entidad en todo momento puede estar:
Gestionada (managed/attached): est asociada a un EntityManager que hace un seguimiento de los cambios que se producen en la instancia y los sincroniza con la BD No gestionada (unmanaged/dettached)
Contexto de persistencia: el conjunto de entidades gestionadas en un momento dado por un EntityManager
No gestionadas EntityManager

Tema 2 JPA - 18

Contexto de persistencia
Hay varios tipos de contextos de persistencia. Uno de ellos es el de alcance transaccin.
Se crea al inicio de una transaccin Cuando finaliza la transaccin se cierra, y todas las instancias que gestionaba se convierten en dettached

Tema 2 JPA - 19

Servicios de EntityManager
persist()
Primero creamos nuestras instancias Inicializamos sus propiedades y relaciones Invocamos el servicio persist()
public void crearAsignatura(String codigo, String nombre, int creditos) { Asignatura asig = new Asignatura(); asig.setCodigo(codigo); asig.setNombre(nombre); asig.setCreditos(creditos); entityManager.persist(asig); }

La instancia de la entidad para a ser managed Se programa su insercin en la BD


Tema 2 JPA - 20

Servicios de EntityManager
find()
Nos permite localizar la instancia de una entidad por su clave primaria. Si no la encuentra, devuelve null
public void cambiarNumCreditos(String codigo, int numCreditos) { Asignatura asig = entityManager.find(Asignatura.class, codigo); asig.setCreditos(numCreditos); }

La instancia devuelta ser managed o no segn se invoque dentro o fuera de una transaccin
Tema 2 JPA - 21

Servicios de EntityManager
remove()
Programa la eliminacin de una instancia de la base de datos Hemos de pasarle una instancia que sea managed
public void eliminarAsignatura(String codigo) { Asignatura asig = entityManager.find(Asignatura.class, codigo); entityManager.remove(asig); }

Tema 2 JPA - 22

Servicios de EntityManager
merge()
Una instancia puede ser dettached, enviada a un cliente, modificada por ste y vuelta a enviar al servidor para ser resincronizada con la BD
public Asignatura getAsignatura(String codigo) { return entityManager.find(Asignatura.class, codigo); } public void actualizarAsignatura(Asignatura asig) { Asignatura copia = entityManager.merge(asig); } Tema 2 JPA - 23

Servicios de EntityManager
EntityManager es tambin una factora de objetos Query
public Collection<Asignatura> getAsignaturasCurso(int curso) { String ejbql = from Asignatura a where curso.numero = :curso; Query query = entityManager.createQuery(ejbql); query.setParameter(curso, curso); return query.getResultList(); }

Tema 2 JPA - 24

flush() y FlushModeType
Cuando invocamos persist(), remove() y merge(), estos cambios no son sincronizados con la BD hasta que el EntityManager lo decide. Ello depende del modo FlushModeType:
AUTO: los cambios son sincronizados antes de una query y antes del commit (es el valor por defecto) COMMIT: los cambios son sincronizados slo antes del commit

Establecemos el modo con:


entityManager.setFlushModeType(FlushModeType.COMMIT)
Tema 2 JPA - 25

Unidad de persistencia
Es un conjunto de entidades (clases anotadas con @Entity) mapeadas a una misma base de datos Se define en un fichero persistence.xml
<?xml version="1.0" encoding="UTF-8" ?> <persistence> <persistence-unit name=cursos"> <jta-data-source>java:/Cursos</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop /> </properties> </persistence-unit> </persistence>

Tema 2 JPA - 26

Obtener un EntityManager
Hay varias formas. En la ms sencilla, utilizamos el mecanismo de inyeccin de dependencias.
@Stateless public class ServicioCursosBean implements ServicioCursos { @PersistenceContext(unitName=cursos) EntityManager em; // ... }
Tema 2 JPA - 27

Mapping O-R bsico


@Entity @Table(name=ASIG) public class Asignatura { // . . . @Id @GeneratedValue public Long getCodigo() {...} // . . . public String getNombre() {...} // . . . @Column (name=CREDS) public int getCreditos() {...} // . . . } ASIG PK CODIGO NOMBRE CREDS

Existen mappings por defecto pero tambin podemos controlar casi cualquier aspecto del modelo fsico

Tema 2 JPA - 28

Relaciones
Podemos mapear relaciones unidireccionales o bidireccionales, singledvalued o multi-valued. Relaciones
OneToOne OneToMany ManyToOne ManyToMany Empleado Empleado Empleado Empleado
1 1..* 1..* 1..* 1..* 0..1 1

Direccion Departamento Departamento Proyecto

0..*

Tema 2 JPA - 29

Relaciones - Ejemplo
@Entity public class Asignatura { private Curso curso; @ManyToOne @JoinColumn (name=CURSO) public Curso getCurso() {...} // . . . } }
ASIGNATURA PK CODIGO NOMBRE CREDS FK CURSO CURSO PK NUMERO

@Entity public class Curso { private Collection<Asignatura> asignaturas; @Id public Integer getNumero() {...} @OneToMany(mappedBy=curso) public Collection<Asignatura> getAsignaturas() {...} // . . .

Tema 2 JPA - 30

fetch
Podemos especificar que una cierta informacin no se recupere de la BD cuando se recupere la entidad con el tipo de fetch (EAGER o LAZY) Por defecto los atributos y las relaciones single-valued tienen tipo de fetch EAGER y las relaciones multi-valued LAZY
@Entity public class Empleado { private DatosBancarios db; @OneToOne (fetch=FetchType.LAZY) public DatosBancarios getDatosBancarios() {...} // . . . }

Tema 2 JPA - 31

Relaciones y cascada
La cascada se usa para propagar el efecto de una operacin sobre una entidad a las entidades relacionadas. Puede ser:
PERSIST REMOVE MERGE REFRESH ALL
} @Entity public class Empleado { private Direccion direccion; @ManyToOne (cascade=CascadeType.PERSIST) public Direccion getDireccion() {...} // . . .

Tema 2 JPA - 32

Herencia
El API de persistencia soporta la herencia entre entidades Existen tres estrategias bsicas para el mapeo de la herencia:
Single table Table per concrete class Joined Strategy

Tema 2 JPA - 33

Herencia - Ejemplo
@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public abstract class Asignatura { }
ASIGNATURA_TRONCAL

@Entity public abstract class AsignaturaTroncal { } @Entity public abstract class AsignaturaOptativa { }

PK

CODIGO NOMBRE CREDS

ASIGNATURA_OPTATIVA PK CODIGO NOMBRE CREDS FK ITINERARIO_ID

Tema 2 JPA - 34

S-ar putea să vă placă și