Saltar la navegación

Ejemplo

Cuentas Bancarias

En este ejemplo consideraremos que una persona puede tener varias cuentas bancarias en diferentes bancos. El diagrama de clases sería el siguiente.

Modelo Clases Ejercicio Banca

Trataremos de implementar el ORM (JPA) para este ejemplo. Por tanto, primero debemos:

  • Crear y mapear las clases
  • Hacer uso del EntityManager para ejecutar las siguientes operaciones de ejemplo:
    • Crear una Persona con el nombre Nestor y calve nestor123
    • Crear el Banco con nombre HOLANDES
    • Crear una cuenta con el número 9993837 para Nestor,  en el banco HOLANDES
    • Obtener la persona "Nestor" e imprimir su información
    • Actualizar el nombre de "Nestor" por "Nestor Pons"
    • Consultar las personas que cumplen con el nombre "Nestor Pons" y clave "nestor123" (realizarlo con JPQL, de manera Nativa y también como NamedQuery)

Persona

@Entity
@Table(name="Persona")
@NamedQueries({
	@NamedQuery(name="encontrarPersonaPorNombreYClave", query= "SELECT p from Persona p WHERE p.nombre= :param_nombre AND p.clave= :param_clave"),
	@NamedQuery(name="listarPersonas", query= "SELECT p from Persona p ORDER BY p.nombre ASC")
})
public class Persona implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="idPersona")
	private Integer id;
	
	@Column(name="nombre")
	private String nombre;
	
	@Column(name="clave")
	private String clave;


	public Persona() {

	}

	public Persona(int id, String nombre, String clave) {
		this.id = id;
		this.nombre = nombre;
		this.clave = clave;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getClave() {
		return clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}


	@Override
	public String toString() {
		return this.nombre+ ' '+ this.clave;
	}
	@Override
	public int hashCode() {
		int hash = 0;
        hash += (this.id != null ? this.id.hashCode() : 0);
        return hash;
	}
	@Override
	public boolean equals(Object object) {
        if (!(object instanceof Persona)) {
            return false;
        }
        Persona other = (Persona) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
	}
}

Banco

@Entity
@Table(name="Banco")
public class Banco implements Serializable {

	
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="idBanco")
	private Integer id;
	
	@Column (name="nombre_banco")
	private String nombreBanco;
	
	@OneToMany (fetch = FetchType.LAZY, mappedBy = "banco")
	private List<CuentaBancaria> cuentas;

	public Banco() {
	}
	
	public Banco(String nombreBanco) {
		this.nombreBanco = nombreBanco;
	}
	

	public String getNombreBanco() {
		return nombreBanco;
	}

	public void setNombreBanco(String nombreBanco) {
		this.nombreBanco = nombreBanco;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}
	

	public List<CuentaBancaria> getCuentas() {
		return cuentas;
	}

	public void setCuentas(List<CuentaBancaria> cuentas) {
		this.cuentas = cuentas;
	}

	@Override
	public int hashCode() {
		int hash = 0;
        hash += (this.id != null ? this.id.hashCode() : 0);
        return hash;
		
	}

	@Override
	public boolean equals(Object object) {
		
		// TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Banco)) {
            return false;
        }
        Banco other = (Banco) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
	}

	@Override
	public String toString() {
		return "Banco: " + this.nombreBanco;
	}
}

CuentaBancaria

@Entity
@Table(name="Cuenta")
@NamedQueries({
	@NamedQuery(name = "listarCuentas", query = "SELECT c FROM CuentaBancaria c")
})
public class CuentaBancaria implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column (name="id_cuenta")
	private Integer id;
	
	@Column(name="numero")
	private String numero;
	
	@ManyToOne (cascade = CascadeType.PERSIST)
	@JoinColumn(name = "banco")
	private Banco banco;
	
	@ManyToOne (cascade = CascadeType.PERSIST)
	@JoinColumn (name="propietario")
	private Persona propietario;

	public CuentaBancaria() {

	}
	
	public CuentaBancaria(String numero, Banco banco, Persona propietario) {
		this.numero = numero;
		this.banco = banco;
		this.propietario = propietario;
	}


	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public Banco getBanco() {
		return banco;
	}

	public void setBanco(Banco banco) {
		this.banco = banco;
	}

	public Persona getPropietario() {
		return propietario;
	}

	public void setPropietario(Persona propietario) {
		this.propietario = propietario;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (id != null ? id.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof CuentaBancaria)) {
			return false;
		}
		CuentaBancaria other = (CuentaBancaria) obj;
		if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return "Número cuenta : "+ this.getNumero();
	}

}



Uso de EntityManager

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import modelo.entidades.Banco;
import modelo.entidades.CuentaBancaria;
import modelo.entidades.Persona;

public class EntityManagerTest {

	public static void main(String[] args) {

		insertar();
		
		leer();
		
		actualizar();
		
		eliminar();
		
		insertarPersist();
		
		consultarJPQL();
		
		consultarJPQLNativa();

	}

	public static void insertar() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();

		// Insertar Persona Nestor
		Persona nestor = new Persona(0, "Nestor", "nestor123");
		em.getTransaction().begin();
		em.persist(nestor);
		em.getTransaction().commit();

		// Insertar Banco
		Banco holandes = new Banco();
		holandes.setNombreBanco("BCO. HOLANDES");
		em.getTransaction().begin();
		em.persist(holandes);
		em.getTransaction().commit();

		// Insertar Cuenta Bancaria
		CuentaBancaria cuenta = new CuentaBancaria();
		cuenta.setNumero("9993837");
		cuenta.setPropietario(nestor);
		cuenta.setBanco(holandes);

		em.getTransaction().begin();
		em.persist(cuenta);
		em.getTransaction().commit();
	}

	/**
	 * Demostración de insercion en conjunto gracias a la Cascade = Persiste.Insert
	 */
	public static void insertarPersist() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();

		Persona luis = new Persona(0, "Luis", "luis123");
		Banco pichincha = new Banco();
		pichincha.setNombreBanco("BCO. PICHINCHA");

		// Insertar Cuenta en banco holandes para Nestor
		CuentaBancaria cuentaLuisPichincha = new CuentaBancaria();
		cuentaLuisPichincha.setNumero("9993837");
		cuentaLuisPichincha.setPropietario(luis);
		cuentaLuisPichincha.setBanco(pichincha);

		em.getTransaction().begin();
		em.persist(cuentaLuisPichincha);
		em.getTransaction().commit();

	}

	public static void leer() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();
		
		// Leer persona con id=1
		Persona p5 = em.find(Persona.class, 1);
		System.out.println(p5);
	}

	public static void actualizar() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();

		// Actualizar el nombre de Nestor a Nestor Pons Persona p2 =
		Persona p2 = em.find(Persona.class, 1);
		p2.setNombre("Nestor Pons");
		em.getTransaction().begin();
		em.merge(p2);
		em.getTransaction().commit();

	}

	public static void eliminar() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();

		// Eliminar Persona
		Persona p3 = em.find(Persona.class, 2);
		em.getTransaction().begin();
		em.remove(p3);
		em.getTransaction().commit();

	}

	public static void consultarJPQL() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();

		String sentenceJPQL = "SELECT p from Persona p WHERE p.nombre= :param_nombre AND p.clave= :param_clave";
		Query query = em.createQuery(sentenceJPQL);
		query.setParameter("param_nombre", "Nestor");
		query.setParameter("param_clave", "nestor123");
		Persona personaAutorizada = (Persona) query.getSingleResult();
		System.out.println(personaAutorizada);

	}

	public static void consultarJPQLNativa() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaPersona");
		EntityManager em = emf.createEntityManager();

		String sentenceSQL = "SELECT p.* FROM PERSONA p WHERE p.nombre='Nestor' AND p.clave='nestor123'";
		Query query2 = em.createNativeQuery(sentenceSQL, Persona.class);
		Persona persona2 = (Persona) query2.getSingleResult();
		System.out.println(persona2);
	}
}