EJB (jar) y JPA agregando la capa de persistencia (Parte 3)
El objetivo es agregar al EJB creado en la parte 2 y agregar la capa de persistencia con JPA.
Crear un EJB empaquetado en un jar y subirlo al app server y hacer una prueba (test la cual no se pudo realizar por problemas con la compatibilidad de glassfish) finalmente probar el jar el cual contiene funcionamiento a JPA mediante una clase de java.
Configurando la clase Persona en @Entity agregando el persistence.xml e inyectando la dependencia en el servico que es un EJB @Stateless
Estrutura del proyecto:
Crearemos el persistence.xml
utilizando JTA por lo que hay que configurar la BD desde Glassfish
Agregamos al pom.xml el driver de mysql y las librerias de log4j
Modifcamos la clase persona para convertirla en @Entity en la clase le agregamos algunos queries el cual usamos sintaxis de JPQL, tambien le estamos agregando el nombre de la tabla en la anotacion
Esta clase debe mplementar la interfaz serializable ya que se puede enviar de manera remota de un servidor a un cliente.
Definimos la variable serial.
---------------------------------
Persona.java
package mx.com.gm.sga.domain;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@NamedQueries({
@NamedQuery(name = "Persona.findAll", query = "SELECT p FROM Persona p ORDER BY p.idPersona")})
@Table(name = "persona")
public class Persona implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_persona")
private int idPersona;
@Column(nullable = false, length = 45)
private String nombre;
@Column(name = "apellido_paterno", nullable = false, length = 45)
private String apePaterno;
@Column(name = "apellido_materno", length = 45)
private String apeMaterno;
@Column(nullable = false, length = 45)
private String email;
@Column(length = 45)
private String telefono;
public Persona() {
}
public Persona(int idPersona) {
this.idPersona = idPersona;
}
public Persona(int idPersona, String nombre, String apePaterno, String apeMaterno,
String email, String telefono) {
this.idPersona = idPersona;
this.nombre = nombre;
this.apePaterno = apePaterno;
this.apeMaterno = apeMaterno;
this.email = email;
this.telefono = telefono;
}
public int getIdPersona() {
return idPersona;
}
public void setIdPersona(int idPersona) {
this.idPersona = idPersona;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApePaterno() {
return apePaterno;
}
public void setApePaterno(String apePaterno) {
this.apePaterno = apePaterno;
}
public String getApeMaterno() {
return apeMaterno;
}
public void setApeMaterno(String apeMaterno) {
this.apeMaterno = apeMaterno;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTelefono() {
return telefono;
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
@Override
public String toString() {
return "Persona [idPersona=" + idPersona + ", nombre=" + nombre
+ ", apePaterno=" + apePaterno + ", apeMaterno=" + apeMaterno
+ ", email=" + email + ", telefono=" + telefono + "]";
}
}
---------------------------------
PersonaDao.java
package mx.com.gm.sga.eis;
import java.util.List;
import mx.com.gm.sga.domain.Persona;
public interface PersonaDao {
public List<Persona> findAllPersonas();
public Persona findPersonaById(Persona persona);
public Persona findPersonaByEmail(Persona persona);
public void insertPersona(Persona persona);
public void updatePersona(Persona persona);
public void deletePersona(Persona persona);
}
---------------------------------
PersonaDaoImpl.java como punto importante el método listar se obtuvo invocando a la consulta realizada desde la entidad persona PErsona.findAll Se define como EJB para que se puede inyectar el persistenceContext
package mx.com.gm.sga.eis;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import mx.com.gm.sga.domain.Persona;
@Stateless
public class PersonaDaoImpl implements PersonaDao {
@PersistenceContext(unitName = "PersonaPU")
EntityManager em;
@Override
public List<Persona> findAllPersonas() {
return em.createNamedQuery("Persona.findAll").getResultList();
}
@Override
public Persona findPersonaById(Persona persona) {
return em.find(Persona.class, persona.getIdPersona());
}
@Override
public Persona findPersonaByEmail(Persona persona) {
Query query = em.createQuery("from Persona p where p.email =: email");
query.setParameter("email", persona.getEmail());
return (Persona) query.getSingleResult();
}
@Override
public void insertPersona(Persona persona) {
em.persist(persona);
}
@Override
public void updatePersona(Persona persona) {
em.merge(persona);
}
@Override
public void deletePersona(Persona persona) {
em.merge(persona);
em.remove(persona);
}
}
---------------------------------
PersonaServiceImpl.java: Utilizamos la anotacion @Stateless y @Inject para inyectar la dependencia del DAO de persona.
package mx.com.gm.sga.servicio;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import mx.com.gm.sga.domain.Persona;
import mx.com.gm.sga.eis.PersonaDao;
@Stateless
public class PersonaServiceImpl implements PersonaServiceRemote, PersonaService {
//Se puede usar la anotacion @EJB o @Inject usa el concepto CDI
@Inject
private PersonaDao personaDao;
@Override
public List<Persona> listarPersonas() {
return personaDao.findAllPersonas();
}
@Override
public Persona encontrarPersonaPorId(Persona persona) {
return personaDao.findPersonaById(persona);
}
@Override
public Persona encontrarPersonaPorEmail(Persona persona) {
return personaDao.findPersonaByEmail(persona);
}
@Override
public void registrarPersona(Persona persona) {
personaDao.insertPersona(persona);
}
@Override
public void modificarPersona(Persona persona) {
personaDao.updatePersona(persona);
}
@Override
public void eliminarPersona(Persona persona) {
personaDao.deletePersona(persona);
}
}
---------------------------------
Ahora debemos configurar el elemento de JTA en el servidor de glasshfish:
Agregamos el jar al glassfish\lib
Creamos el recurso jdbc/
Subimos el jar y posteriormente ejecutamos la clase de prueba.
---------------------------------
ClientePersonaService.java.
package mx.com.gm.sga.cliente;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import mx.com.gm.sga.domain.Persona;
import mx.com.gm.sga.servicio.PersonaServiceRemote;
public class ClientePersonaService {
public static void main(String[] args) {
System.out.println("Iniciando llamada al EJB desde el cliente\n");
try {
Context jndi = new InitialContext();
PersonaServiceRemote personaService = (PersonaServiceRemote) jndi.lookup("java:global/sga-jee3/PersonaServiceImpl!mx.com.gm.sga.servicio.PersonaServiceRemote");
List<Persona> personas = personaService.listarPersonas();
for (Persona persona : personas) {
System.out.println(persona);
}
System.out.println("\nFin llamada al EJB desde el cliente");
} catch (NamingException e) {
e.printStackTrace();
}
}
}
Finalmente se adjunta el condigo del proyecto:
No hay comentarios.