fernandezperezjuanjose_memorianegociopersistencia
TRANSCRIPT
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".
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:
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.
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