JPA: ¿Qué es y Cómo Funciona la Java Persistence API?

¿Que es JPA? ¿Cómo funciona?. Este es una de las preguntas más habituales cuando empezamos a trabajar con Java Persistence API . Son muchos los conceptos que aparecen y al principio cuesta encajarlos todos.

Vamos a ver un ejemplo de JPA y cómo usar Java Persistence API para salvar objetos en nuestra base de datos . Al comienzo esto siempre genera dudas, muchas dudas . Por lo tanto vamos a construir una serie de ejemplos que nos ayuden a entenderlo mejor.

Cómo Configurar Java Persistence API con Persistence.xml

En primer lugar vamos a hablar es del fichero persistence.xml que se encuentra ubicado en la carpeta META-INF de un proyecto Java EE . Puesto que este fichero se encarga de conectarnos a la base de datos y define el conjunto de clases que vamos a gestionar. Por suerte el fichero es parte del standard y existirá en cualquier implementación de JPA que se utilice.

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
 version="2.0">
 <persistence-unit name="UnidadPersonas">
 <class>es.curso.bo.Persona</class>
 <properties>
 <property name= "hibernate.show_sql" value="true" />
 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
 <property name="javax.persistence.jdbc.user" value="root" />
 <property name="javax.persistence.jdbc.password" value="jboss" />
 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa" />

</properties>

</persistence-unit>

Ademas en el documento XML podemos ver tanto nuestra clase de persistencia (Persona) como las propiedades de conexión a la base de datos. Una unidad de persistencia como su nombre indica se encarga de gestionar un conjunto de entidades contra una base de datos . Por lo tanto tiene que definir las entidades que gestiona y la conectividad.

JPA Configuración y Uso de EntityManagerFactory

En Java Persistence API el fichero persistence.xml define la conexion a la base de datos y las entidades que vamos a considerar salvables en ella. Como resultado de ambos conceptos se genera un objeto EntityManagerFactory que se encargará de guardar todas estas entidades para la base de datos.

De esta forma tendremos un EntityManagerFactory con el que empezar a guardar las entidades que se encuentran definidas a nivel del fichero persistence.xml. Eso si, muchas aplicaciones JEE conectan a varias bases de datos y tendrán diferentes EntityManagerFactorys . Cada uno estará ligado un PersistenceUnit diferente.

Java Persistence API y la Función de EntityManagerFactory

Lo habitual es disponer de un único EntityManagerFactory con el que nosotros gestionamos todas las entidades. Una vez tenemos de un EntityManagerFactory , este será capaz de construir varios objetos EntityManager que facilitan la persistencia de los objetos o entidades,

Hay que recordar que estas entidades son objetos POJO (Plain Old Java Object) con los que estamos trabajando en nuestro programa . Por consiguiente , el EntityManager será el encargado de realizar todas las operaciones de tipo CRUD ( insertar , borrar ,seleccionar y actualizar etc) sobre ellos. En nuestro caso sobre la clase Persona.

Gestión de Entidades y PersistenceContext en Java

¿Qué es un PersistenceContext? . En primer lugar hay que tener en cuenta que un EntityManager persistirá un “conjunto de objetos” ¿Pero qué objetos? . Aquellos que hayan sufrido modificaciones a nivel de sus propiedades y no estén sincronizados . Esto es a lo que comunmente se le denomina PersistenceContext.

Por ello para conseguir que alguno de nuestros objetos pase a ubicarse dentro del PersistenceContext bastará con invocar los métodos persist , merge , sobre él o algún método find.

JPA Ejemplo Práctico de Java Persistence API

Una vez un objeto se encuentra dentro del PersistenceContext el EntityManager este será capaz de controlar todos los cambios que se han realizado en él y ejecutar las consultas adecuadas contra la base de datos

package com.arquitecturajava;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

import com.arquitecturajava.models.Persona;

public class Principal01Add {

    public static void main(String[] args) {

        Persona yo = new Persona("Pedro", 25);
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("UnidadPersonas");
        EntityManager em = emf.createEntityManager();

        try {
            em.getTransaction().begin();
            em.persist(yo);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
        } finally {
            em.close();
            emf.close();
        }
    }
}

En este ejemplo hemos usado el método persist() el EntityManager para salvar la información en base de datos. Hemos tenido ademas que manejar esta persistencia bajo en entorno transaccional . De tal forma que cuando se ejecute el método merge pasemos a confirmar la transacción) . Los datos serán salvados en la base de datos. Vamos a ver un ejemplo complementario de listado.

package com.arquitecturajava;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import com.arquitecturajava.models.Persona;

import java.util.List;

public class Principal02List {

    public static void main(String[] args) {

        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("UnidadPersonas");
        EntityManager em = emf.createEntityManager();

        try {
            em.getTransaction().begin();

            // Consulta JPQL moderna
            List<Persona> personas = em
                    .createQuery("SELECT p FROM Persona p", Persona.class)
                    .getResultList();

            for (Persona p : personas) {
                System.out.println("Nombre: " + p.getNombre() + ", Edad: " + p.getEdad());
            }

            em.getTransaction().commit();

        } catch (Exception e) {
            e.printStackTrace();
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
        } finally {
            em.close();
            emf.close();
        }
    }
}

Ejemplo de Java Persistence API (Video)

Finalmente vamos a ver un ejemplo complementario en video .Para ello usaremos clase Libro en mi curso gratuito de introducción a JPA que nos sirva de complemento y apoyo al código que acabamos de ver:

Otros artículos relacionados

  1. Un ejemplo de JPA Entity Graph
  2. EntityManager métodos
  3. Relaciones OneToMany
  4. Usando @ ManyToOne
  5. Persistencia y Merge
  6. JPA Remove y objetos Gestionados
  7. Spring Boot JPA

Cursos gratuitos relacionados

  1. Introducción a JPA