You are on page 1of 26

www.gl obal mentoring.com .

mx
Crear un ejercicio para poner en práctica el concepto de
asociaciones con JPA. Al finalizar deberemos observar:

www.gl obal mentoring.com .mx


En caso que no tengamos abierto el proyecto sga-jee lo
abrimos (la última versión):

www.gl obal mentoring.com .mx


En caso que no tengamos abierto el proyecto sga-jee lo
abrimos:

www.gl obal mentoring.com .mx


Esperamos a que cargue completamente el proyecto. En caso que marque error el
proyecto, hacemos un Clean & Build para que se muestren todos los archivos, este
paso es opcional:

www.gl obal mentoring.com .mx


Copiamos el proyecto para ponerlo en la nueva ruta:

www.gl obal mentoring.com .mx


Copiamos el proyecto para ponerlo en la nueva ruta:

www.gl obal mentoring.com .mx


Cerramos el proyecto anterior y dejamos solo el nuevo:

www.gl obal mentoring.com .mx


Creamos una clase para probar el tipo de asociaciones:

www.gl obal mentoring.com .mx


Creamos una clase para probar el tipo de asociaciones:

www.gl obal mentoring.com .mx


Archivo ClienteAsociacionesJPA.java : Clic para descargar código
package mx.com.gm.sga.cliente.asociaciones;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import mx.com.gm.sga.domain.Persona;
import mx.com.gm.sga.domain.Usuario;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ClienteAsociacionesJPA {

static Logger log = LogManager.getRootLogger();

public static void main(String[] args) {

EntityManagerFactory emf = Persistence.createEntityManagerFactory("ConsolaJpqlPU");


EntityManager em = emf.createEntityManager();

List<Persona> personas = em.createNamedQuery("Persona.findAll").getResultList();

//Cerramos la conexion
em.close();
www.gl obal mentoring.com .mx
Archivo ClienteAsociacionesJPA.java : Clic para descargar código
//Imprimimos las personas
imprimirPersonas(personas);
}

private static void imprimirPersonas(List<Persona> personas){


//Objetos en estado detached o desconectados
for (Persona persona : personas) {
log.debug("Persona: " + persona);
//Recuperamos los usuarios de cada persona
for (Usuario usuario : persona.getUsuarios()) {
log.debug("Usuario: " + usuario);
}
}
}
}

www.gl obal mentoring.com .mx


Archivo Usuario.java: Clic para descargar código
De la clase Usuario.java sólo modificamos la relación para definirla como Eager:

@JoinColumn(name = "id_persona", referencedColumnName = "id_persona")


@ManyToOne(fetch = FetchType.EAGER)
private Persona persona;

www.gl obal mentoring.com .mx


Archivo Persona.java: Clic para descargar código
De la clase Persona.java sólo modificamos la relación para definirla como Eager:

@OneToMany(mappedBy = "persona", fetch = FetchType.EAGER)


private List<Usuario> usuarios;

www.gl obal mentoring.com .mx


www.gl obal mentoring.com .mx
En el resultado vemos como el select incluye la selección de usuarios, ya que indicamos que los recuperara también (tipo Eager),
y aunque cerremos la conexión, podemos acceder a esta colección de usuarios desde la entidad de Persona:
[EL Info]: connection: 05-04 22:59:08.731--ServerSession(403147759)--/file:/C:/Cursos/JavaEE/Leccion05/sga-jee/target/classes/_ConsolaJpqlPU login successful
[EL Fine]: sql: 05-04 22:59:08.804--ServerSession(403147759)—

Connection(632627844)--SELECT id_persona, apellido_materno, apellido_paterno, email, nombre, telefono FROM persona

[EL Fine]: sql: 05-04 22:59:08.835--ServerSession(403147759)—


Connection(632627844)--SELECT id_usuario, password, username, id_persona FROM usuario WHERE (id_persona = ?)
bind => [1]

[EL Fine]: sql: 2017-05-04 22:59:08.851--ServerSession(403147759)—


Connection(632627844)--SELECT id_usuario, password, username, id_persona FROM usuario WHERE (id_persona = ?)
bind => [6]

22:59:08 [main] DEBUG - Persona: Persona{idPersona=1, nombre=Oscar, apellidoPaterno=Gomez, apellidoMaterno=Torres, email=ogomez@mail.com.mx34567,


telefono=55780109}

22:59:08 [main] DEBUG - Usuario: Usuario{idUsuario=1, username=ogomez, password=123, persona=Persona{idPersona=1, nombre=Oscar, apellidoPaterno=Gomez,
apellidoMaterno=Torres, email=ogomez@mail.com.mx34567, telefono=55780109}}

22:59:08 [main] DEBUG - Persona: Persona{idPersona=6, nombre=Maria, apellidoPaterno=Gutierrez, apellidoMaterno=Esparza, email=maria@mail.com.mx,


telefono=11113333}
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------

www.gl obal mentoring.com .mx


Creamos una clase para probar persistencia en cascada:

www.gl obal mentoring.com .mx


Creamos una clase para probar persistencia en cascada:

www.gl obal mentoring.com .mx


Archivo PersistenciaCascadaJPA: Clic para descargar código
package mx.com.gm.sga.cliente.cascada;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import mx.com.gm.sga.domain.Persona;
import mx.com.gm.sga.domain.Usuario;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class PersistenciaCascadaJPA {

static Logger log = LogManager.getRootLogger();

public static void main(String[] args) {

EntityManagerFactory emf = Persistence.createEntityManagerFactory("ConsolaJpqlPU");


EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
//Inicia la transaccion

//Paso 1. Crea nuevo objeto


//Objeto en estado transitivo
www.gl obal
Persona persona1 = new Persona("Hugo", mentoring.com
"Sanchez", .mx
"Pinto", "hsanchez@mail.com", "33334444");
Archivo PersistenciaCascadaJPA: Clic para descargar código
//Creamos el objeto usuario (tiene dependencia con un objeto persona)
Usuario usuario1 = new Usuario("hsanchez","123",persona1);

//Paso 2. Inicia transaccion


tx.begin();

//Paso 3. Ejecuta SQL


//Solo persistimos el objeto Usuario
//No hay necesidad de persistir el objeto persona, lo hará por cascadeo
em.persist(usuario1);

//Paso 4. Commit/rollback
tx.commit();

//Objeto en estado detached


log.debug("Objeto persistido Usuario:" + usuario1);
log.debug("Objeto persistido Persona:" + persona1);

//Cerramos el Entity Manager


em.close();
}
}

www.gl obal mentoring.com .mx


Archivo Usuario.java: Clic para descargar código
De la clase Usuario.java sólo modificamos la relación para definirla con persistencia en cascada:

@JoinColumn(name = "id_persona", referencedColumnName = "id_persona")


@ManyToOne(cascade = CascadeType.ALL)
private Persona persona;

www.gl obal mentoring.com .mx


Archivo Persona.java: Clic para descargar código
De la clase Persona.java sólo modificamos la relación para definirla como persistencia en cascada,
quedando como sigue:

@OneToMany(mappedBy = "persona", cascade = CascadeType.ALL)


private List<Usuario> usuarios;

www.gl obal mentoring.com .mx


www.gl obal mentoring.com .mx
Solo se persistió el objeto usuario, pero debido a que definimos la relación como persistencia en cascada con
la relación del objeto Persona, también lo persistió en automático, además de que persiste primero el objeto
que no tenga dependencia con ninguna otra clase, para después persistir los objetos que tengan relación con
otras clases de Entidad:
[EL Info]: connection: 05-04 23:43:27.009--ServerSession(902830499)--/file:/C:/Cursos/JavaEE/Leccion05/sga-jee/target/classes/_ConsolaJpqlPU login successful
[EL Fine]: sql: 05-04 23:43:27.759--ClientSession(1709317347)—
Connection(1815501246)--INSERT INTO persona (apellido_materno, apellido_paterno, email, nombre, telefono) VALUES (?, ?, ?, ?, ?)
bind => [Pinto, Sanchez, hsanchez@mail.com, Hugo, 33334444]

[EL Fine]: sql: 05-04 23:43:27.806--ClientSession(1709317347)--Connection(1815501246)--SELECT LAST_INSERT_ID()


[EL Fine]: sql: 05-04 23:43:27.822--ClientSession(1709317347)--Connection(1815501246)--INSERT INTO usuario (password, username, id_persona) VALUES (?, ?, ?)
bind => [123, hsanchez, 8]
[EL Fine]: sql: 05-04 23:43:27.822--ClientSession(1709317347)--Connection(1815501246)--SELECT LAST_INSERT_ID()

DEBUG - Objeto persistido Usuario:Usuario{idUsuario=2, username=hsanchez, password=123, persona=Persona{idPersona=8, nombre=Hugo,


apellidoPaterno=Sanchez, apellidoMaterno=Pinto, email=hsanchez@mail.com, telefono=33334444}}

DEBUG - Objeto persistido Persona:Persona{idPersona=8, nombre=Hugo, apellidoPaterno=Sanchez, apellidoMaterno=Pinto, email=hsanchez@mail.com,


telefono=33334444}
------------------------------------------------------------------------
BUILD SUCCESS
----------------------------------------------------------

www.gl obal mentoring.com .mx


Con este ejercicio puesto en el concepto de asociaciones en JPA.

Modificamos las relaciones para probar el concepto de EagerLoading y


LazyLoading.

Y también creamos una prueba para la persistencia en cascada modificando


las clases de Entidad para poder probar este concepto.

www.gl obal mentoring.com .mx


Por: Ing. Ubaldo Acosta

www.gl obal mentoring.com .mx

You might also like