JPA (Java Persistence)

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Es una especificación standard de la industria del desarrollo con Java para manipular una base de datos relacional utilizando la programación orientada a objetos como aproximación.

Al ser una especificación, por sí sola no puede manipular la base de datos. Es un conjunto de interfaces que deben ser implementadas.

¿Por qué usamos JPA, si es casi idéntico a Hibernate?

La razón tiene un contexto histórico. Primero estaban los EJB para hacer operaciones contra la base de datos. Pero consumían mucha memoria y eran complejos de programar. Le gente comenzó a pasarse a Hibernate para hacer operaciones contra la base de datos. Hibernate no era la solución oficial, pero se convirtió en un standard del mercado.

Lo que hizo Sun Microsystems (propietarios de Java en aquel entonces) fue desarrollar una solución oficial (JPA) que era una interfaz y que en el 99.9% de los casos implementa Hibernate, aunque podría implementar cualquier otra cosa.

Cómo configurar JPA

Main.java
public class Main {
    public static void main(String[] args){
        EntityManager em = EntityManager.getEntityManager();
      
        Customer customer=new Customer("Pablo", "Monteserín");        
        Address address=new Address("Calle Falsa 123");
        customer.setAddress(address);
        
        try {
            em.getTransaction().begin();
            em.persist(customer);
            em.getTransaction().commit();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            em.close();
        }
    }
}
src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="TEST_PERSISTENCE_JPA"
		transaction-type="RESOURCE_LOCAL">
	
		<properties>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/prueba-jpa?serverTimezone=UTC" />
			<property name="javax.persistence.jdbc.user" value="pm" />
			<property name="javax.persistence.jdbc.password" value="pp" />

			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />

			<!-- hace cambios -->
			<property name="hibernate.hbm2ddl.auto" value="update" />

			<!-- si los cambios los fastidian todo, no hace cambios -->
			<!-- <property name="hibernate.hbm2ddl.auto" value="validate" /> -->

			<!-- <property name="hibernate.hbm2ddl.auto" value="create-drop" /> -->
			<property name="show_sql" value="true" />
		</properties>
	</persistence-unit>
</persistence>

Entity Manager Singleton

Un patrón de diseño es una solución a un problema concreto en el desarrollo de software.

Singleton para usar con JPA:

public class EntityManagerSingleton{
	private static EntityManagerFactory emf;

	public static EntityManager getEntityManager() {	
		if (emf == null) {
			 emf = Persistence.createEntityManagerFactory("TEST_PERSISTENCE_JPA");
		}
		EntityManager em = emf.createEntityManager();
		return em;
	}
}

Otras operaciones

Consultas

Consulta de un listado de objetos
TypedQuery <Invitado>query = em.createQuery("SELECT i from Invitado i", Invitado.class);
List<Invitado> result =query.getResultList();
Consulta de un solo objeto
TypedQuery<Usuario> query = em.createQuery("SELECT u from Usuario u WHERE u.nombre=:name AND u.pass=:password", Usuario.class);
query.setParameter("name", nombre);
query.setParameter("password", password);

Update

em.merge(usuario);

Remove

Invitado invitado = em.find(Invitado.class, id);
em.remove(invitado);
em.remove(em.contains(invitado) ? invitado : em.merge(invitado));

Para borrado y actualización, usaremos query en lugar de typed query.

Query query = em.createQuery("DELETE FROM Invitado i WHERE nombre = :condicion");
← Eventos en Hibernate
Estructura de un proyecto usando DAO →