fernandezperezjuanjose_memorianegociopersistencia

4

Click here to load reader

Upload: juanjofd

Post on 02-Aug-2015

21 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: FernandezPerezJuanJose_MemoriaNegocioPersistencia

MEMORIA DE LA PRÁCTICA DE NEGOCIO Y PERSISTENCIA Juan José Fernández Pérez

ACCESO A BEANS CDI DESDE JSF

Defino la clase Mensaje con la anotación de dependencia @Named que sirve para

asociar un nombre al bean. El nombre asignado se utiliza para acceder al objeto a

través de una referencia EL. En este caso la referencia será el nombre de la clase con

la primera letra minúscula, así que desde la página Bienvenido.xhtml se hace

referencia a “#{mensaje.mensajeBienvenida()}” para mostrar el mensaje de

bienvenida y desde Despedida.xhtml se hace referencia a

“#{mensaje.mensajeDespedida()}” para mostrar el mensaje de despedida.

CREACIÓN DEL EJB SIN ESTADO EJBFichaje

Creo el EJB de sesión sin estado de la siguiente forma:

@Stateless public class EJBFichaje Todo bean de sesión sin estado es necesario que disponga de una interface, como he

definido directamente el bean sin la creación de la interface, el propio contenedor la

crea como interface Local.

Dentro de este EJB se usa la anotación @PersistenceContext para inyectar un

entitymanager en el bean de sesión sin estado. El contenedor de EJB nos proporciona

el contexto de persistencia mediante inyección por lo que no tendremos que

preocuparnos de su creación y destrucción.

Además EJBFichaje dispone de tres métodos:

- Fichar que recibe un objeto de tipo Fichaje conteniendo el usuario y la fecha y

hora a la que se ficha, y persiste estos datos en la base de datos usando la

operación EntityManager.persist.

- buscarPorFechas que tiene como argumentos una fecha inicial y una fecha

final para los que se hace la búsqueda (objetos de tipo Date) y devuelve una

lista de objetos de tipo Fichaje. Esta lista representa un conjunto de pares

usuario y momento en el que fichó (entre la fecha inicial y la fecha final),

ordenados según el momento en el que fichó.

Esta búsqueda se hace usando la operación

EntityManager.createNamedQuery para ejecutar la consulta dinámica

"Practica.buscarPorUsuario".

- buscarPorUsuario que recibe un objeto de tipo String (el nombre del usuario

para el que se hace la búsqueda ) y devuelve una lista de objetos de tipo

Fichaje. Esta lista representa un conjunto de pares usuario y momento en el

que fichó para ese usuario ordenados según el momento en el que fichó.

Esta búsqueda se hace usando la operación

EntityManager.createNamedQuery para ejecutar la consulta dinámica

"Practica.buscarPorFechas".

Page 2: FernandezPerezJuanJose_MemoriaNegocioPersistencia

MEMORIA DE LA PRÁCTICA DE NEGOCIO Y PERSISTENCIA Juan José Fernández Pérez

SIGUIENTE NIVEL DE ABSTRACCIÓN, LA CLASE FICHAJESERVICE

La interfaz “FichajeServiceInterface” es implementada por las dos clases

FichajeService (Mock y Real) y tienen los mismos métodos:

La clase FichajeService con funcionalidad REAL inyecta EJBFichaje a través de la

anotación @EJB private EJBFichaje ejbfichaje, y tiene los siguientes métodos:

- Fichar llama al método ejb.fichaje para que persista el objeto fichaje en la base

de datos.

- buscarPorFechas que llama al método ejb.buscarPorFechas para obtener una

lista de objetos Fichaje (entre la fecha inicial y la fecha final), ordenados según

el momento en el que fichó.

Una vez que tiene la lista calcula el tipo de fichaje (ENTRADA o SALIDA) para

cada elemento de la misma.

- buscarPorUsuario que llama al método ejb.buscarPorFechas para obtener

una lista de objetos Fichaje, ordenados según el momento en el que fichó.

Una vez que tiene la lista calcula el tipo de fichaje (ENTRADA o SALIDA) para

cada elemento de la misma.

La clase FichajeService con funcionalidad MOCK tiene los siguientes métodos:

- Fichar que no hace nada.

- buscarPorFechas y buscarPorUsuario que devuelven una lista de objetos

Fichaje constantes y ficticios, simulando así el resultado de una posible

búsqueda.

Las anotaciones @real y @Mock se definen en Real.java y en Mock.java

respectivamente.

SIGUIENTE NIVEL DE ABSTRACCIÓN, MbeanBuscador y MbeanPrincipal

El managed bean MbeanBuscador inyecta las clases Fichajeservice REAL y MOCK

(o bien una o la otra) usando las anotaciones :

import uned.JuanJoseFernandez.fichaje.negocio.interfaces.Real; @Inject @Real FichajeService buscador; y

import uned.JuanJoseFernandez.fichaje.negocio.interfaces.Mock; @Inject @Mock FichajeService buscador;

MbeanBuscador dispone entre otros de los métodos:

Page 3: FernandezPerezJuanJose_MemoriaNegocioPersistencia

MEMORIA DE LA PRÁCTICA DE NEGOCIO Y PERSISTENCIA Juan José Fernández Pérez

BuscarPorUsuario: Llama al método buscarPorUsuario de FichajeService para

obtener una lista de objetos Fichaje, ordenados según el momento de fichaje y la

transforma en una lista de objetos FichajeDetalle, que es la estructura de datos que

maneja la pantalla Resultados.xhtml para mostrar los datos en pantalla.

BuscarPorFechas: Llama al método buscarPorFechas de FichajeService para

obtener una lista de objetos Fichaje, ordenados según el momento de fichaje y la

transforma en una lista de objetos FichajeDetalle, que es la estructura de datos que

maneja la pantalla Resultados.xhtml para mostrar los datos en pantalla.

El managed bean MbeanPrincipal inyecta las clases Fichajeservice REAL y MOCK (o

bien una o la otra) usando las anotaciones :

import uned.JuanJoseFernandez.fichaje.negocio.interfaces.Real; @Inject @Real FichajeService servicio; y

import uned.JuanJoseFernandez.fichaje.negocio.interfaces.Mock; @Inject @Mock FichajeService servicio;

MbeanPrincipal dispone del método fichar que llama al método fichar de

FichajeService para registrar el fichaje en la base de datos.

BASE DE DATOS Y ENTIDAD JPA

En la base de datos se guarda para cada fichaje un registro con tres campos:

- Un ID de tipo BIGINT que va a ser la clave primaria del registro.

- Un campo TIEMPO de tipo TIMESTAMP que va a almacenar la fecha y la hora

del fichaje.

- Un campo LOGIN de tipo VARCHAR que va a almacenar el nombre del usuario

que ficha.

No se almacena información sobre el tipo de fichaje (entrada o salida) puesto que se

puede generar a través de la lógica de negocio.

La clase Fichaje la anoto con @Entity dado que va a ser el bean de entidad de la

aplicación que asocio a la tabla “FICHAJE”. Así el campo id, usuario y momento de la

clase Fichaje los hago corresponder con los campos ID, TIEMPO y LOGIN de la base

de datos. Y el campo tipo lo marco con la anotación @Transient dado que tiene

correspondencia con ningún campo de la base de datos puesto que no se persiste.

Page 4: FernandezPerezJuanJose_MemoriaNegocioPersistencia

MEMORIA DE LA PRÁCTICA DE NEGOCIO Y PERSISTENCIA Juan José Fernández Pérez

En la pestaña servicios de netbeans creo la base de datos Práctica pulsando el botón

derecho del ratón sobre JAVA DB

Para que se cree en la carpeta Server Resources el fichero glassfish-resources.xml

con la definición del pool de conexiones del Datasource que usará la aplicación sigo

los pasos siguientes:

En netbeans creo un pool de conexiones en el menú File New File

Glassfish JDBC Conection Pool. Con el nombre Practica_Pool y a partir de

la conexión jdbc:derby://localhost:1527/Practica, le indico que el usuario y la

contraseña son APP y que la tabla se llama FICHAJE

Después creo un nuevo recurso JDBC en el menú File New File Glassfish

JDBC Resource . Usando el pool de conexiones existente de nombre

Practica_Pool y con el nombre JNDI jdbc/Practica .

Una unidad de persistencia define el conjunto de entidades y su configuración de

mapeo que asociada al origen de datos. Las unidades de persistencia se definen en

un archivo con nombre persistence.xml. Para generar la nuestra en el menú File

New File Persistence Persistence Unit .

PersistenceUnit name: PracticaPU Persistence Provider: EclipseLink Datasource: jdbc/Practica Marco: Use Java Transaction API y Table generation strategy=Create